Удалить дубликаты из массива объектов на основе критерия - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть массив объектов, подобный этому:

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

Как этого добиться?

EDIT:

Я протестировал одно из приведенных ниже решений со следующими данными и заметил, что исходный массив изменен:

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

Outuput:

> 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 голосов
/ 04 сентября 2018

Вот использование 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);
0 голосов
/ 04 сентября 2018

Использование Array.reduce и Object.values ​​

Создайте карту с id как ключ и соответствующий object как значение . Для каждого объекта в массиве проверьте, существует ли id в карте. Если нет, добавьте запись, сравните значение nb и установите более высокое значение на карте.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...