2017-08-16 43 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); 
 
});