[英]Push to a new array inside a map/promise
這是我當前設置的簡化版本。
運行此代碼時,您會注意到修改changes
數組還會操縱原始的referrals
數組。 這是因為我要push
送到map函數內部的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); });
您只需要創建內部對象的深層副本,就可以使用lodash deepClone或spread運算符來完成。
像這樣:
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}); // You will create a copy here.
}
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);
});
感謝blex引導我了解這里的情況。 本質上,當我將對象推送到新數組時,我推送的是整個引用,而不僅僅是副本。 使用Object.assign
克隆對象解決了我的問題。
這是整個編輯供參考:
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) { new Promise(function(resolve, reject) { if (referral.change) { changes.push(Object.assign({}, 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); });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.