2017-10-17 59 views
0

我的工作,我已經有了2個對象數組和下面都是不同的情況下,數據可以在一個項目。操縱物體陣列以獨特的數據

// Case 1 
var arr1=[{id:1,quantity:10}] 
var arr2=[{id:1,quantity:10},{id:2,quantity:20}] 

// Case 2 
var arr1=[] 
var arr2=[{id:1,quantity:10},{id:2,quantity:20}] 

// Case 3 
var arr1=[{id:1,quantity:12}] 
var arr2=[{id:1,quantity:10},{id:2,quantity:20}] 

// Case 4 
var arr1=[{id:1,quantity:10},{id:1,quantity:20}] 
var arr2=[{id:1,quantity:10}] 

因此,陣列1可能是爲空,可能有array2中的一個對象,或者array2中的對象具有不同的數量值。

我想更新基於arr2的主數組或arr1,但不想用arr1 = arr2類型的解決方案將arr1完全刷入arr2。 arr1應根據arr2更新數量並根據相同的事情添加或刪除數量。

+0

你可以給一個之前/之後的例子嗎? –

+0

代碼如何同時更新和添加和刪除元素? – guest271314

+0

你能解釋一下結果如何與'arr1 = arr2'不同嗎? – trincot

回答

1

如果arr1 = arr2將是一個解決方案,但要發生變異arr1,而不是更換它,那麼可以考慮使用splice

var arr1=[{id:0,quantity:1},{id:2,quantity:12},{id:3,quantity:9}], 
 
    arr2=[{id:1,quantity:10},{id:2,quantity:20}]; 
 

 
arr1.splice(0, arr1.length, ...arr2); 
 

 
console.log(arr1);

如果您關注的是,在arr1的對象不應該是更換當存在於arr2他們id,但要突變(保持它們的引用),那麼我會建議:

var arr1=[{id:0,quantity:1},{id:2,quantity:12},{id:3,quantity:9}], 
 
    arr2=[{id:1,quantity:10},{id:2,quantity:20}]; 
 
// key both arrays by id in Maps 
 
var mp1 = new Map(arr1.map(obj => [obj.id, obj])), 
 
    mp2 = new Map(arr2.map(obj => [obj.id, obj])); 
 
// traverse arr1 from right to left so deletions will not affect the loop 
 
arr1.reduceRight((_, obj, i) => { 
 
    if (mp2.has(obj.id)) { 
 
     Object.assign(obj, mp2.get(obj.id)); // update 
 
    } else { 
 
     arr1.splice(i, 1); // delete 
 
    } 
 
}, null); 
 
arr2.forEach((obj) => { 
 
    if (!mp1.has(obj.id)) { 
 
     arr1.push(obj); // insert 
 
     // If you need the inserted object to be a copy, then do: 
 
     // arr1.push(Object.assign({}, obj)); 
 
    } 
 
}); 
 

 
// If you need the result to be sorted by `id`, then do this also: 
 
arr1.sort((a,b) => a.id - b.id); 
 

 
console.log(arr1);

+0

我試過這種方法,但是因爲這增加了從array2到array1的所有內容,並且由於我在角度上使用了這個邏輯,動畫和這動畫所有的增加,而不是一個添加。我只想要添加一個動畫效果而不是一切,因此在這裏提出這個問題,否則一個簡單的谷歌搜索就可以解決它。感謝 – DevX136

+0

我添加了第二個解決方案,當'arr2'中存在'id'時,它會在'arr1'中保持對象引用。 – trincot

+0

這看起來是正確的,可能會起作用,一旦我回家,就會測試它。 – DevX136

1
for(const el of arr2){ 
const dupe = arr1.find(e => e.id === el.id); 
if(dupe){ 
    dupe.quantity = el.quantity; 
}else{ 
    arr1.push(el); 
} 
} 

但實際上是一個地圖(ID - >量)將在這裏更好的數據結構(或對象):

const els = new Map(arr1.map(el => [el.id, el.quantity])); 
//to add 
arr2.forEach(el => els.set(el.id, el.quantity + (els.get(el.id) ||0)); 
+1

在第二種解決方案中 - 添加一個默認的'(els.get(el.id)|| 0)',或者如果它不是重複的,就會得到一個'NaN'。 –

+0

不錯的解決方案,但如果arr2的元素比arr1小,那麼arr1不會更改爲arr2。 – DevX136

+0

@ devX136不,它不應該... –