这是我当前设置的简化版本。推送到地图/承诺中的新阵列
运行此代码时,您会注意到修改changes
阵列还会操纵原始的referrals
阵列。这是因为我push
ing地changes
阵列内的地图功能?如何在不修改referrals
阵列的情况下修改changes
阵列?
var referrals = [
{
id: 1,
name: 'John',
change: true
},
{
id: 2,
name: 'Sally',
change: false
},
{
id: 3,
name: 'Kim',
change: true
}
];
var changes = [];
var process = referrals.map(function(referral) {
return new Promise(function(resolve, reject) {
if (referral.change) {
changes.push(referral);
}
resolve();
});
});
Promise.all(process).then(function() {
console.log('referrals before:', referrals);
changes = changes.map(function(change) {
change.change_id = change.id;
delete change.id;
return change;
});
console.log('changes:', changes);
console.log('referrals after:', referrals);
});
你不改变'referrals'阵列。你正在改变它包含的对象。没有使用Promise,你会得到相同的结果。当你把你的对象放到'changes'数组中时,你实际上是在推送引用数组中的对象。不是他们的副本,这是你似乎认为的。那么,当您更改这些对象的属性时,这些差异将显示在这些对象被引用的位置。为了解决这个问题,查看“JS克隆对象” – blex
WTH是否使用promise?代码中没有任何异步。 – Bergi
@Bergi我在我的实际代码中需要承诺,因为我要在每个对象之间进行一些请求。我减少了我发布的例子。 – floatleft