2016-07-10 3 views
4

У меня есть этот массив объектов:Как объединить дубликаты в массиве объектов и суммировать определенное свойство?

var arr = [ 
    { 
     name: 'John', 
     contributions: 2 
    }, 
    { 
     name: 'Mary', 
     contributions: 4 
    }, 
    { 
     name: 'John', 
     contributions: 1 
    }, 
    { 
     name: 'Mary', 
     contributions: 1 
    } 
]; 

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

var arr = [ 
    { 
     name: 'John', 
     contributions: 3 
    }, 
    { 
     name: 'Mary', 
     contributions: 5 
    } 
]; 

Как я мог достичь этого с помощью JavaScript?

+2

Вы пробовали что-нибудь до сих пор? –

ответ

3

Вы можете использовать хеш-таблицу и создать новый массив с суммами, которые вам нужны.

var arr = [{ name: 'John', contributions: 2 }, { name: 'Mary', contributions: 4 }, { name: 'John', contributions: 1 }, { name: 'Mary', contributions: 1 }], 
 
    result = []; 
 

 
arr.forEach(function (a) { 
 
    if (!this[a.name]) { 
 
     this[a.name] = { name: a.name, contributions: 0 }; 
 
     result.push(this[a.name]); 
 
    } 
 
    this[a.name].contributions += a.contributions; 
 
}, Object.create(null)); 
 

 
console.log(result);

+1

Вы можете использовать новый объект ES6 Map: 'var result = new Map(); arr.forEach ((элемент) => { если (результат.get (элемент.имя)) результат.set (element.name, result.get (element.name) + element.contributions); else result.set (element.name, element.contributions); }); console.log (результат); ' –

0

Вы также мог бы сделать это с помощью рамки Linq, который предоставляется linq.js

вот мой код, используя linq.js и это почти выглядеть SQL заявление.

var arr = [ 
 
    { 
 
     name: 'John', 
 
     contributions: 2 
 
    }, 
 
    { 
 
     name: 'Mary', 
 
     contributions: 4 
 
    }, 
 
    { 
 
     name: 'John', 
 
     contributions: 1 
 
    }, 
 
    { 
 
     name: 'Mary', 
 
     contributions: 1 
 
    } 
 
]; 
 

 

 
var aggregatedObject = Enumerable.From(arr) 
 
     .GroupBy("$.name", null, 
 
       function (key, g) { 
 
        return { 
 
         name: key, 
 
         contributions: g.Sum("$.contributions") 
 
        } 
 
     }) 
 
     .ToArray(); 
 

 
console.log(aggregatedObject);
<script src="http://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.min.js"></script>

Смежные вопросы