ここに私の現在の設定の簡略版があります。地図/約束の中で新しい配列にプッシュ
このコードを実行すると、changes
配列を変更すると、元のreferrals
配列も操作されることがわかります。これは、push
changes
の配列内にマップ関数があるためですか? アレイを変更せずに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);
});
。それに含まれるオブジェクトを変更しています。また、約束を使わずに同じ結果が得られます。あなたのオブジェクトを 'changes'配列にプッシュすると、' referrals'配列にあるオブジェクトへの参照を実際にプッシュしています。彼らのコピーではなく、あなたが考えるようなものです。したがって、これらのオブジェクトのプロパティを変更すると、これらのオブジェクトが参照されるすべての場所にこれらの違いが表示されます。これを解決するには、「JSクローンオブジェクト」を参照してください。 – blex
WTHは約束を使用していますか?あなたのコードには何も非同期です。 – Bergi
@Bergi私は実際のコードで約束をする必要があります。なぜなら、私は各オブジェクトの間にいくつかの要求があるからです。私は投稿された例をスリム化しました。 – floatleft