#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 }
]*/
Сокращение должно быть быстрее в большинстве случаев, но вы никогда не знаете.