2017-08-16 73 views
0

这是我当前设置的简化版本。推送到地图/承诺中的新阵列

运行此代码时,您会注意到修改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); 
 
});

+3

你不改变'referrals'阵列。你正在改变它包含的对象。没有使用Promise,你会得到相同的结果。当你把你的对象放到'changes'数组中时,你实际上是在推送引用数组中的对象。不是他们的副本,这是你似乎认为的。那么,当您更改这些对象的属性时,这些差异将显示在这些对象被引用的位置。为了解决这个问题,查看“JS克隆对象” – blex

+0

WTH是否使用promise?代码中没有任何异步。 – Bergi

+0

@Bergi我在我的实际代码中需要承诺,因为我要在每个对象之间进行一些请求。我减少了我发布的例子。 – floatleft

回答

0

你只需要创建内部对象的深层副本,您可以用lodash deepClone,或传播运营商做到这一点。

类似的东西:

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); 
}); 
0

感谢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); 
 
});