2016-12-10 11 views
1

У меня есть массив как это:Для добавления количества подобных объектов в JavaScript массив (ES5)

var data = [ 
    { catNumber: 'EK-21200', quantity: 5}, 
    { catNumber: 'EK-00341', quantity: 5}, 
    { catNumber: 'EK-21200', quantity: 5}, 
    { catNumber: 'EK-21200', quantity: 5}, 
    { catNumber: 'EK-00341', quantity: 5} 
]; 

Я хочу, чтобы результат суммирования всех количеств же catNumber.

var data = [ 
    { catNumber: 'EK-21200', quantity: 15}, 
    { catNumber: 'EK-00341', quantity: 10} 
]; 
+0

catNumber это исправить или многое другое ?? – Darshak

+0

№ Может быть «n» число catNumbers. Таким образом, это должно быть сумма количеств подобных catNumbers. –

ответ

2

Вы можете использовать этот код: ES6

var data = [ 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-00341', quantity: 5}, 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-00341', quantity: 5} 
 
]; 
 

 
data = Array.from(data.reduce((acc, {catNumber, quantity}) => 
 
    acc.set(catNumber, (acc.get(catNumber) || 0) + quantity), 
 
    new Map() 
 
), ([catNumber, quantity]) => ({catNumber, quantity})); 
 

 
console.log(data);

Или, в ES5 версии:

var data = [ 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-00341', quantity: 5}, 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-00341', quantity: 5} 
 
]; 
 

 
var acc = data.reduce(function(acc, obj) { 
 
    acc[obj.catNumber] = (acc[obj.catNumber] || 0) + obj.quantity; 
 
    return acc; 
 
}, {}); 
 
data = Object.keys(acc).map(function(key) { 
 
    return { catNumber: key, quantity: acc[key] }; 
 
}); 
 

 
console.log(data);

И, наконец, вот версия, которая не использует массива итерационные методы, такие как reduce или map, но использует for петли вместо:

var data = [ 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-00341', quantity: 5}, 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-21200', quantity: 5}, 
 
    { catNumber: 'EK-00341', quantity: 5} 
 
]; 
 

 
var acc = {}; 
 
for (var i = 0; i < data.length; i++) { 
 
    var obj = data[i]; 
 
    if (!acc[obj.catNumber]) acc[obj.catNumber] = 0; 
 
    acc[obj.catNumber] += obj.quantity; 
 
} 
 
data = []; 
 
for (var key in acc) { 
 
    data.push({ catNumber: key, quantity: acc[key] }); 
 
} 
 

 
console.log(data);

+0

Спасибо за ответ. Но я использую ES5. В настоящее время я не могу изменить версию для проекта, как сейчас. Было бы полезно получить в формате ES5. –

+0

Я добавил версию ES5 того же самого. – trincot

+0

Я только начал с JS. Лот, чтобы учиться и практиковать больше. Спасибо за решение. –