Сравнить объекты внутри одного массива и объединить их значения
Подскажите как решить данную проблему:
Есть массив объектов:
let family = [{'name':'apple', 'delivery_time': '11:00', 'prise':'100'},
{'name':'pear', 'delivery_time': '12:00', 'prise':'100'},
{'name':'melon', 'delivery_time': '13:00', 'prise':'100'},
{'name':'apple', 'delivery_time': '11:00', 'prise':'100'}];
Как внутри этого массива узнать, есть ли повторные значения (в данном примере это apple), и дальше создать новый массив объектов, куда записать все уникальные значение, а также оставить только один apple с объединенной ценой 200, чтобы получилось так:
let family_two = [{'name':'apple', 'delivery_time': '11:00', 'prise':'200'},
{'name':'pear', 'delivery_time': '12:00', 'prise':'100'},
{'name':'melon', 'delivery_time': '13:00', 'prise':'100'}];
Пробовал делать это в цикле на сам массив, типа
for (var ii = 0; ii < family .length; ii++) {}
но получаются все значения сравниваются сами с собой.
Подскажите, пожалуйста, логику кода или пример функции, чтобы решить данную задачу?
Ответы (1 шт):
Как-то так хотели?
let family = [{'name':'apple', 'delivery_time': '11:00', 'prise':'100'},
{'name':'pear', 'delivery_time': '12:00', 'prise':'100'},
{'name':'melon', 'delivery_time': '13:00', 'prise':'100'},
{'name':'apple', 'delivery_time': '11:00', 'prise':'100'}];
let result = family.reduce((acc, item) => {
let oldItem = acc.find(oldItem => oldItem.name === item.name);
if (oldItem) {
oldItem.prise = ""+((+oldItem.prise)+(+item.prise))}
else {
acc.push(item)
}
return acc;
},
[]);
console.log(result);
объекты сравниваются по полям
acc.find(oldItem => oldItem.name === item.name)
По логике. Пробегаемся по массиву готовим результирующий набор. Если элемент существует в наборе то прибавляем значения если нет то добавляем сам элемент в результирующий набор.
или тоже самое в ручной минификации. (только ради забавы)
let family = [{'name':'apple', 'delivery_time': '11:00', 'prise':'100'},
{'name':'pear', 'delivery_time': '12:00', 'prise':'100'},
{'name':'melon', 'delivery_time': '13:00', 'prise':'100'},
{'name':'apple', 'delivery_time': '11:00', 'prise':'100'}];
let result = family.reduce((a, i) => {let o=a.find(o=>o.name==i.name);o&&(o.prise=""+((+o.prise)+(+i.prise)))||a.push(i);return a},[]);
console.log(result)