這是我當前設置的簡化版本。推送到地圖/承諾中的新陣列
運行此代碼時,您會注意到修改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