这是我当前设置的一个简化版本。
在运行这段代码时,您会注意到修改changes数组也会操作原始的referrals数组。这是因为我要在push函数中对changes数组执行push操作吗?如何在不修改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);
});
发布于 2017-08-17 03:59:04
你只需要创建一个内部对象的深层副本,你可以用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);
});发布于 2017-08-17 05:40:51
感谢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);
});
https://stackoverflow.com/questions/45721828
复制相似问题