[javascript] Node.js에서 객체 복제

node.js에서 객체를 복제하는 가장 좋은 방법은 무엇입니까

예를 들어 다음과 같은 상황을 피하고 싶습니다.

var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6

객체는 속성으로 복잡한 유형을 포함 할 수 있으므로 간단한 for (var x in obj1)로는 해결되지 않습니다. 재귀 복제본을 직접 작성해야합니까 아니면 보이지 않는 것이 내장되어 있습니까?



답변

가능성 1

프릴이 적은 사본 :

var obj2 = JSON.parse(JSON.stringify(obj1));

가능성 2 (더 이상 사용되지 않음)

주의 : 이제이 솔루션은 Node.js 문서 에서 더 이상 사용되지 않는 것으로 표시됩니다 .

util._extend () 메소드는 내부 Node.js 모듈 외부에서 사용되도록 설계되지 않았습니다. 커뮤니티는 어쨌든 그것을 찾아서 사용했습니다.

더 이상 사용되지 않으며 새 코드에서 사용해서는 안됩니다. JavaScript는 Object.assign ()을 통해 매우 유사한 내장 기능을 제공합니다.

원래 답변 : :

얕은 사본의 경우 노드의 내장 util._extend()기능을 사용하십시오.

var extend = require('util')._extend;

var obj1 = {x: 5, y:5};
var obj2 = extend({}, obj1);
obj2.x = 6;
console.log(obj1.x); // still logs 5

노드 _extend기능 의 소스 코드 는 다음에 있습니다 : https://github.com/joyent/node/blob/master/lib/util.js

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || typeof add !== 'object') return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};


답변

Object.assign언급되지 않은 것이 놀랍습니다 .

let cloned = Object.assign({}, source);

사용 가능한 경우 (예 : Babel) 객체 스프레드 연산자를 사용할 수 있습니다 .

let cloned = { ... source };


답변

Object.defineProperty(Object.prototype, "extend", {
    enumerable: false,
    value: function(from) {
        var props = Object.getOwnPropertyNames(from);
        var dest = this;
        props.forEach(function(name) {
            if (name in dest) {
                var destination = Object.getOwnPropertyDescriptor(from, name);
                Object.defineProperty(dest, name, destination);
            }
        });
        return this;
    }
});

사용할 수있는 확장 방법을 정의합니다. 이 기사에서 코드가 나온다 .


답변

var obj2 = JSON.parse(JSON.stringify(obj1));


답변

JQuery에서 확장 기능을 사용할 수 있습니다.

var newClone= jQuery.extend({}, oldObject);  
var deepClone = jQuery.extend(true, {}, oldObject); 

Node.js 플러그인도 있습니다 :

https://github.com/shimondoodkin/nodejs-clone-extend

JQuery 또는 플러그인없이 수행하려면 여기를 읽으십시오.

http://my.opera.com/GreyWyvern/blog/show.dml/1725165


답변

underscore.js를 확인하십시오 . 그것은 복제확장 과 다른 많은 유용한 기능을 가지고 있습니다.

이것은 유용 할 수 있습니다 : Node.js와 함께 밑줄 모듈 사용


답변

“자신의 롤”을 원하지 않는 경우 일부 노드 모듈이 있습니다. 이것은 좋아 보인다 : https://www.npmjs.com/package/clone

순환 참조를 포함하여 모든 종류의 물건을 처리하는 것처럼 보입니다. 로부터 github의의 페이지 :

복제 마스터는 개체, 배열, 날짜 개체 및 RegEx 개체를 복제합니다. 모든 것이 재귀 적으로 복제되므로 예를 들어 객체의 배열에서 날짜를 복제 할 수 있습니다. […] 순환 참조? 네!