我有一个这样的对象数组:
let arr = [
{id: 1, nb: 1},
{id: 2, nb: 1},
{id: 3, nb: 1},
{id: 1, nb: 2},
{id: 1, nb: 3},
{id: 2, nb: 2},
]
我想获得一个对象数组,通过选择具有最高nb
值的元素来删除重复的元素。这意味着我想得到:
arr2 = [
{id: 1, nb: 3},
{id: 2, nb: 2},
{id: 3, nb: 1},
]
如何实现?
编辑:
我使用以下数据测试了以下解决方案之一,并注意到原始数组已修改:
let arr = [
{id: 1, nb: 1},
{id: 1, nb: 2},
{id: 1, nb: 3},
{id: 2, nb: 2},
{id: 2, nb: 3},
{id: 2, nb: 1},
{id: 3, nb: 1},
{id: 2, nb: 4},
{id: 1, nb: 10},
{id: 2, nb: 6},
];
console.log(arr);
let tmp = {};
var result = {};
for(let i=0; i<arr.length; i++) {
if( !tmp[arr[i].id] ) {
tmp[arr[i].id] = arr[i];
} else {
if( tmp[arr[i].id].nb < arr[i].nb ) {
tmp[arr[i].id].nb = arr[i].nb;
}
}
}
result = Object.values(tmp);
console.log(result);
console.log(arr);
输出:
> Array [Object { id: 1, nb: 1 }, Object { id: 1, nb: 2 }, Object { id: 1, nb: 3 }, Object { id: 2, nb: 2 }, Object { id: 2, nb: 3 }, Object { id: 2, nb: 1 }, Object { id: 3, nb: 1 }, Object { id: 2, nb: 4 }, Object { id: 1, nb: 10 }, Object { id: 2, nb: 6 }]
> Array [Object { id: 1, nb: 10 }, Object { id: 2, nb: 6 }, Object { id: 3, nb: 1 }]
> Array [Object { id: 1, nb: 10 }, Object { id: 1, nb: 2 }, Object { id: 1, nb: 3 }, Object { id: 2, nb: 6 }, Object { id: 2, nb: 3 }, Object { id: 2, nb: 1 }, Object { id: 3, nb: 1 }, Object { id: 2, nb: 4 }, Object { id: 1, nb: 10 }, Object { id: 2, nb: 6 }]
答案 0 :(得分:0)
使用id
作为键并使用相应的object
作为值来创建地图。对于数组中的每个对象,检查映射中是否存在id
。如果没有添加条目,则比较nb
的值并在map中设置较高的值。
let arr = [{id: 1, nb: 1},{id: 2, nb: 1},{id: 3, nb: 1},{id: 1, nb: 2},{id: 1, nb: 3},{id: 2, nb: 2}];
let result = Object.values(arr.reduce((a,c) => {
a[c.id] ? a[c.id].nb = a[c.id].nb < c.nb ? c.nb : a[c.id].nb : a[c.id] = c;
return a;
}, new Map()));
console.log(result);
答案 1 :(得分:0)
这里是Array.forEach()
解决方案的O(n)
用法,用于获得该输出:
let arr = [
{id: 1, nb: 1},
{id: 2, nb: 1},
{id: 3, nb: 1},
{id: 1, nb: 2},
{id: 1, nb: 3},
{id: 2, nb: 2},
];
var tempObj = {};
arr.forEach((obj)=>{
if(!tempObj[obj.id]){
tempObj[obj.id] = obj;
} else {
if(tempObj[obj.id].nb < obj.nb){
tempObj[obj.id].nb = obj.nb;
}
}
});
var res = Object.values(tempObj);
console.log(res);