在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)解决不了问题。我需要自己写一个递归克隆吗?还是有一些我没有看到的内置的东西?
在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()提供了非常类似的内置功能。
原来的答案::
对于浅拷贝,使用Node内置的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
Node的_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;
};
其他回答
我很惊讶,客体。还没有提到Assign。
let cloned = Object.assign({}, source);
如果可用(例如Babel),你可以使用对象展开操作符:
let cloned = { ... source };
如果你不想“滚出你自己的”,还有一些Node模块。这个看起来不错:https://www.npmjs.com/package/clone
看起来它可以处理各种各样的东西,包括循环引用。来自github页面:
clone主人克隆对象,数组,日期对象和RegEx 对象。所有内容都是递归克隆的,因此您可以克隆日期 例如,在对象的数组中。[…循环推荐?是的!
在Github上也有一个项目,旨在成为jQuery.extend()的更直接的端口:
https://github.com/dreamerslab/node.extend
下面是一个例子,来自jQuery文档:
var extend = require('node.extend');
var object1 = {
apple: 0,
banana: {
weight: 52,
price: 100
},
cherry: 97
};
var object2 = {
banana: {
price: 200
},
durian: 100
};
var merged = extend(object1, object2);
在NodeJS中克隆Object的最简单和最快的方法是使用Object。Keys (obj)方法
var a = {"a": "a11", "b": "avc"};
var b;
for(var keys = Object.keys(a), l = keys.length; l; --l)
{
b[ keys[l-1] ] = a[ keys[l-1] ];
}
b.a = 0;
console.log("a: " + JSON.stringify(a)); // LOG: a: {"a":"a11","b":"avc"}
console.log("b: " + JSON.stringify(b)); // LOG: b: {"a":0,"b":"avc"}
方法Object。keys需要JavaScript 1.8.5;nodeJS v0.4.11支持此方法
当然对于嵌套对象需要实现递归func
另一个解决方案是使用原生JSON(在JavaScript 1.7中实现),但它比之前的要慢得多(大约慢10倍)
var a = {"a": i, "b": i*i};
var b = JSON.parse(JSON.stringify(a));
b.a = 0;
你也可以使用这个克隆库来深度克隆对象。
npm install --save clone
const clone = require('clone');
const clonedObject = clone(sourceObject);