根据条件从对象数组中删除重复项

时间:2018-09-04 06:51:08

标签: javascript arrays object

我有一个这样的对象数组:

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 }]

2 个答案:

答案 0 :(得分:0)

使用Array.reduceObject.values

使用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);