操纵物体阵列以独特的数据
我的工作,我已经有了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更新数量并根据相同的事情添加或删除数量。
如果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);
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));
在第二种解决方案中 - 添加一个默认的'(els.get(el.id)|| 0)',或者如果它不是重复的,就会得到一个'NaN'。 –
不错的解决方案,但如果arr2的元素比arr1小,那么arr1不会更改为arr2。 – DevX136
@ devX136不,它不应该... –
你可以给一个之前/之后的例子吗? –
代码如何同时更新和添加和删除元素? – guest271314
你能解释一下结果如何与'arr1 = arr2'不同吗? – trincot