尝试执行以下操作时,我遇到一些奇怪的行为:
这是我的示例代码:
var object = [
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 0},
{"test": "Test3", "id": 0},
{"test": "Test4", "id": 0},
];
for(var i=0; i < 4; i++) {
newObject(i).then(function(obj){
console.log(obj);
})
}
function newObject(i) {
return new Promise(function(resolve, reject){
var newObject = object;
newObject[i].id = i;
resolve(newObject);
})
}
我期望从console.log(obj)收到的回馈是类似对象的4倍
[
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 0},
{"test": "Test3", "id": 0},
{"test": "Test4", "id": 0},
];
[
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 1},
{"test": "Test3", "id": 0},
{"test": "Test4", "id": 0},
];
[
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 0},
{"test": "Test3", "id": 2},
{"test": "Test4", "id": 0},
];
[
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 0},
{"test": "Test3", "id": 3},
{"test": "Test4", "id": 0},
];
但是我最终收到的却是相同对象的4倍
[
{"test": "Test1", "id": 0},
{"test": "Test2", "id": 1},
{"test": "Test3", "id": 2},
{"test": "Test4", "id": 3},
];
答案 0 :(得分:2)
您的问题是,在Promise函数中,您引用的是同一对象,而不是创建克隆。
var newObject = object; // this is a reference, not a copy/clone
相反,您需要创建object
数组的深层克隆。
单行执行此操作的一种方法是使用JSON:
var newObject = JSON.parse(JSON.stringify(object));
更好的方法是:
var newObject = object.map(({test, id}) => ({test, id}));