У меня есть массив объектов js, структурированный как указано ниже,
items= [
{
discount: 27.6,
name: 'Floy Vandervort',
price: 230,
quantity: 3,
taxable: 662.4
},
{
discount: 122.88,
name: 'Adriel Abshire II',
price: 256,
quantity: 6,
taxable: 1413.12
},
{
discount: 159.66,
name: 'Tabitha Stroman',
price: 887,
quantity: 2,
taxable: 1614.34
},
{
discount: 27.6,
name: 'Floy Vandervort',
price: 230,
quantity: 3,
taxable: 662.4
},
{
discount: 122.88,
name: 'Adriel Abshire II',
price: 256,
quantity: 6,
taxable: 1413.12
},
{
discount: 159.66,
name: 'Tabitha Stroman',
price: 887,
quantity: 2,
taxable: 1614.34
},
{
discount: 27.6,
name: 'Floy Vandervort',
price: 230,
quantity: 3,
taxable: 662.4
},
{
discount: 122.88,
name: 'Adriel Abshire II',
price: 256,
quantity: 6,
taxable: 1413.12
},
{
discount: 159.66,
name: 'Tabitha Stroman',
price: 887,
quantity: 2,
taxable: 1614.34
}
]
Я хочу избежать дублирования объектов на основе свойства name
.Поэтому я решил объединить их, сохранив его оценку, как показано ниже,
Вариант использования
рассмотреть свойство name
, здесь в массиве выше Флой Вандерворт повторяется 3 раза.Чтобы преобразовать его в один объект, объедините их в один объект, сохранив значение путем сложения.Итак, свойства discount
, quantity
и taxable
должны быть объединены путем добавления, за исключением свойства price
.
Я ищу оптимальное решение, которого я добился, используя итерации по исходному массивуи отправка объединенного объекта в другой массив.Я хочу устранить сложность, это возможно?если да, то как?Вот функция, которую я использую
function(items) {
let filtered = [];
items.forEach((item) => {
if (!isContains(filtered, item)) {
filtered.push(item);
} else {
index = filtered.findIndex((x) => x.name === item.name);
filtered[index].discount += item.discount;
filtered[index].quantity += item.quantity;
filtered[index].taxable += item.taxable;
}
});
return filtered;
}
function isContains(items, ob) {
items.forEach((item) => {
if (item.name === ob.name) {
return true;
}
});
return false;
}