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

问题描述 投票:-3回答:2

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

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 }]
javascript arrays object
2个回答
0
投票

以下是使用Array.forEach() for 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);

0
投票

使用Array.reduceObject.values

使用id作为关键字创建一个地图,并将相应的object作为值。对于数组中的每个对象,检查id是否存在于map中。如果没有添加条目,则比较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);
© www.soinside.com 2019 - 2024. All rights reserved.