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 개체를 복제합니다. 모든 것이 재귀 적으로 복제되므로 예를 들어 객체의 배열에서 날짜를 복제 할 수 있습니다. […] 순환 참조? 네!