Суммируйте свойства совпадающих свойств в списке объектов - PullRequest
0 голосов
/ 04 февраля 2019

В javascript у меня есть массив объектов, который выглядит следующим образом

[{symbol: "SYM", value: 1}, {symbol: "SYM", value: 1}, {symbol: "DOG", value: 2}]

Как мне уменьшить его до

[{symbol: "SYM", value: 2}, {symbol: "DOG", value: 2}]

Т.е. суммировать значения совпадающих символов

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать уменьшить

let obj = [{symbol: "SYM", value: 1}, {symbol: "SYM", value: 1}, {symbol: "DOG", value: 2}]

let op = obj.reduce((out,inp)=>{
  if(out[inp.symbol]){
    out[inp.symbol].value+= inp.value
  } else {
    out[inp.symbol] = inp
  }
  return out
},{})


console.log(Object.values(op))
0 голосов
/ 04 февраля 2019

Вы можете использовать _.groupBy() и _.sumBy() Лодаша:

const fn = _.flow(
  arr => _.groupBy(arr, 'symbol'),
  groups => _.map(groups, g => 
    _.assign({}, _.head(g), { value: _.sumBy(g, 'value') })
  )
);

const arr = [{symbol: "SYM", value: 1}, {symbol: "SYM", value: 1}, {symbol: "DOG", value: 2}]

const result = fn(arr);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 04 февраля 2019
let arr = [{symbol: "SYM", value: 1}, {symbol: "SYM", value: 1}, {symbol: "DOG", value: 2}];
valMap = arr.reduce((acc,val) => {
    if(!acc[val.symbol]) acc[val.symbol]=val.value;
    else acc[val.symbol] += val.value;
    return acc;
} ,{});
const result = Object.keys(valMap).map(key => ({symbol:key, value:valMap[key]}));
...