我不明白为什么以下代码产生不同的输出:
第一种算法:
var data = {
l1: 1,
l2: 2,
l3: 3
};
var datas = [];
for (var i = 0; i < 3; i++) {
datas[i] = {}
for (key in data) {
datas[i][key] = data[key]
}
};
delete datas[0].l1
delete datas[1].l2
delete datas[2].l3
console.log(data)
console.log("%j", datas)
输出:
{ l1: 1, l2: 2, l3: 3 }
[{"l2":2,"l3":3},{"l1":1,"l3":3},{"l1":1,"l2":2}]
第二种算法:
var data = {
l1: 1,
l2: 2,
l3: 3
};
var datas = [];
for (var i = 0; i < 3; i++) {
datas[i] = {}
datas[i] = data ;
};
delete datas[0].l1
delete datas[1].l2
delete datas[2].l3
console.log(data)
console.log("%j", datas)
输出:
{}
[{},{},{}]
答案 0 :(得分:2)
从你的第二个区块/ Algo跟随线:
datas[i]=data
您只是定义了对同一个对象data
的另一个引用(而不是新对象)。因此,在从此data
对象中删除所有属性后,这些引用会反映出此更改。
答案 1 :(得分:1)
使用Lodash(它将创建对象,而不是引用):
var data = {
l1: 1,
l2: 2,
l3: 3
};
var datas = _.map(data,function(v,k){
return _.omit(data,k);
});