Javascript: удаление повторяющихся объектов из массива с помощью условий

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть массив, который выглядит как:

 var array = [
  { name: "product1", rating: 1 },
  { name: "product3", rating: 2 },
  { name: "product1", rating: 2 },
  { name: "product2", rating: 2 },
  { name: "product3", rating: 1 },
  { name: "product4", rating: 2 },
  { name: "product2", rating: 2 }
]
 

Я хочу исключить объекты с повторяющимися именами, но хочу сохранить тот, у которого самый низкий рейтинг. Таким образом, в итоге:

 var newarray = [
  { name: "product1", rating: 1 },
  { name: "product2", rating: 2 },
  { name: "product3", rating: 1 },
  { name: "product4", rating: 2 }
]
 

Используя filter, я получаю два product1 amp; product3 в newarray из-за разных оценок. Ориентируясь по имени, я получаю объект в массиве на основе его исходного положения, что не сработало бы.

Я ищу способ с помощью ванильного javascript сравнить значение для каждого из дублированных объектов и выбрать тот, который имеет наименьшее значение.

Каждое название продукта может появляться до трех раз. Значения будут только 1 или 2.

Ответ №1:

Вы могли бы использовать reduce для группировки по имени с элементом, имеющим наименьший рейтинг каждого имени

 const array = [
  { name: "product1", rating: 1 },
  { name: "product3", rating: 2 },
  { name: "product1", rating: 2 },
  { name: "product2", rating: 2 },
  { name: "product3", rating: 1 },
  { name: "product4", rating: 2 },
  { name: "product2", rating: 2 },
]

const res = Object.values(
  array.reduce((acc, el) => {
    if (!acc[el.name] || acc[el.name].rating > el.rating) {
      acc[el.name] = el
    }
    return acc
  }, {})
)

console.log(res) 

Ответ №2:

Поскольку reduce уже упоминалось, я подумал, что приведу пример использования .filter(), поскольку вы получаете некоторую гибкость в другой области.

 var array = [
  { name: "product1", rating: 1 },
  { name: "product3", rating: 2 },
  { name: "product1", rating: 2 },
  { name: "product2", rating: 2 },
  { name: "product3", rating: 1 },
  { name: "product4", rating: 2 },
  { name: "product2", rating: 2 }
];
var newArray = array.filter((value,iteration,arr)=>{
    for(var i = 0; i < arr.length; i  ){
        if(value.name === arr[i].name amp;amp; iteration != i){
            if(value.rating > arr[i].rating){
                return false
            }else if(value.rating === arr[i].rating amp;amp; iteration > i){
                return false
            }
        }
    }
    return true
});
/*newArray
[
    { name: 'product1', rating: 1 },
    { name: 'product2', rating: 2 },
    { name: 'product3', rating: 1 },
    { name: 'product4', rating: 2 }
]*/
 

Сокращение должно быть быстрее в большинстве случаев, но вы никогда не знаете.