代码重构后对象为空

时间:2016-01-27 17:17:34

标签: javascript

我不明白为什么以下代码产生不同的输出:

第一种算法:

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)

输出:

{}
[{},{},{}]

2 个答案:

答案 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); 
});