sli*_*fty 187 javascript node.js
在node.js中克隆对象的最佳方法是什么
例如,我想避免以下情况:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
Run Code Online (Sandbox Code Playgroud)
该对象可能包含复杂类型作为属性,因此简单的(obj1中的var x)无法解决.我是否需要自己编写一个递归克隆,或者是否有内置的东西我没有看到?
jim*_*mbo 289
低褶边深拷贝:
var obj2 = JSON.parse(JSON.stringify(obj1));
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
dja*_*ski 242
我很惊讶Object.assign
没有提到.
let cloned = Object.assign({}, source);
Run Code Online (Sandbox Code Playgroud)
如果可用(例如Babel),您可以使用对象扩展运算符:
let cloned = { ... source };
Run Code Online (Sandbox Code Playgroud)
Mic*_*lon 23
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;
}
});
Run Code Online (Sandbox Code Playgroud)
这将定义您可以使用的extend方法.代码来自本文.
小智 19
var obj2 = JSON.parse(JSON.stringify(obj1));
Run Code Online (Sandbox Code Playgroud)
小智 13
您可以使用JQuery中的extend函数:
var newClone= jQuery.extend({}, oldObject);
var deepClone = jQuery.extend(true, {}, oldObject);
Run Code Online (Sandbox Code Playgroud)
还有一个Node.js插件:
https://github.com/shimondoodkin/nodejs-clone-extend
要在没有JQuery或插件的情况下执行此操作,请在此处阅读:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
如果不想"自己动手",那里有一些Node模块.这个看起来不错:https://www.npmjs.com/package/clone
看起来它处理各种东西,包括循环引用.从github页面:
clone masters克隆对象,数组,Date对象和RegEx对象.例如,所有东西都是递归克隆的,因此您可以在对象的数组中克隆日期.[...]循环参考?是的!
此代码也是工作原因Object.create()方法使用指定的原型对象和属性创建一个新对象.
var obj1 = {x:5, y:5};
var obj2 = Object.create(obj1);
obj2.x; //5
obj2.x = 6;
obj2.x; //6
obj1.x; //5
Run Code Online (Sandbox Code Playgroud)
小智 6
在NodeJS中克隆对象的简单和最快的方法是使用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"}
Run Code Online (Sandbox Code Playgroud)
Object.keys方法需要JavaScript 1.8.5; nodeJS v0.4.11支持此方法
但是当然对于嵌套对象需要实现递归函数
其他解决方案是使用原生JSON(在JavaScript 1.7中实现),但它比前一个慢得多(慢10倍)
var a = {"a": i, "b": i*i};
var b = JSON.parse(JSON.stringify(a));
b.a = 0;
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
你们都在受苦,但解决方案很简单。
var obj1 = {x: 5, y:5};
Run Code Online (Sandbox Code Playgroud)
var obj2 = {...obj1};
// 繁荣
归档时间: |
|
查看次数: |
151692 次 |
最近记录: |