以下Javascript控制台:
var a = {'foo': []};
var b = {};
for (var key in a) {
b[key] = a[key];
}
a['foo'].push(1);
console.log(b);
收率:
Object foo=[1]
我想为a中每个键的每个数组的b中的值创建一个副本。有更简单的方法吗?
答案 0 :(得分:4)
您可以创建一个“ clone ”函数,该函数基于原始对象constructor创建 new 对象,并且然后克隆原始对象属性(如果它们是对象):
function clone(obj){
if(typeof(obj) != 'object' && obj != null)
return obj; // return the value itself if isn't an object
// or null, since typeof null == 'object';
var temp = new obj.constructor();
for(var key in obj)
temp[key] = clone(obj[key]);
return temp;
}
var a = {'foo': []};
var b = clone(a);
a['foo'].push(1);
console.log(b); // Object foo=[0]
答案 1 :(得分:3)
这称为Deep Copy。您可以在以下位置找到示例:
答案 2 :(得分:0)
更简单的方法:
var a = {'foo': []};
var b = a;
a['foo'].push(1);
console.log(b);
输出相同。
编辑:
var a = {'foo': []};
var b = {};
for (var key in a) {
if (a.hasOwnProperty(key)) {
b[key] = [];
for (var i = 0; i < a[key].length; i += 1) {
b[key][i] = a[key][i];
}
}
}
a['foo'].push(1);
console.log(b);
答案 3 :(得分:0)
因为这将在代码中添加对深度复制数组的支持:
var a = {'foo': []};
var b = {};
for (var key in a) {
if (Object.prototype.toString.call(b[key]) === "[object Array]") {
b[key] = a[key].slice(0);
} else {
b[key] = a[key];
}
}
a['foo'].push(1);
console.log(b);