2017-08-16 15 views
0

ここに私の現在の設定の簡略版があります。地図/約束の中で新しい配列にプッシュ

このコードを実行すると、changes配列を変更すると、元のreferrals配列も操作されることがわかります。これは、pushchangesの配列内にマップ関数があるためですか? アレイを変更せずに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

。それに含まれるオブジェクトを変更しています。また、約束を使わずに同じ結果が得られます。あなたのオブジェクトを 'changes'配列にプッシュすると、' referrals'配列にあるオブジェクトへの参照を実際にプッシュしています。彼らのコピーではなく、あなたが考えるようなものです。したがって、これらのオブジェクトのプロパティを変更すると、これらのオブジェクトが参照されるすべての場所にこれらの違いが表示されます。これを解決するには、「JSクローンオブジェクト」を参照してください。 – blex

+0

WTHは約束を使用していますか?あなたのコードには何も非同期です。 – 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を使用してオブジェクトを複製すると、私の問題が解決します。

は、ここで参考のために全体の編集です:あなたは `referrals`配列を変更していない

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