操纵唯一数据的对象数组

时间:2017-10-17 20:18:44

标签: javascript arrays object

我正在开发一个项目,我有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}]

因此,array1可能为空,可能有array2中的一个对象,或者两个具有不同数量值的array2对象。

我想基于arr2更新主阵列或arr1但是不想用arr2用arr1 = arr2类型的解决方案完全刷arr1。 arr1应该根据arr2更新数量,并根据同样的事情添加或删除。

2 个答案:

答案 0 :(得分: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);
 }
}

但实际上,Map(id - > quantity)将是更好的数据结构(或对象):

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 :(得分:1)

如果arr1 = arr2是一个解决方案,除了你想要变异 arr1而不是替换它,那么考虑使用{{1} }}:



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中的id存在arr2,{<1}}中的对象 ,则 em>(保留他们的参考资料),然后我会建议:

&#13;
&#13;
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);
&#13;
&#13;
&#13;