lodash _.sum и _.sumBy

September 9, 2019

Вчера решил довольно простую задачку: есть массив объектов, у некоторых объектов одинаковые ключи. Нужно взять эти объекты с одинаковыми ключами, объединить, а цифровые значения просуммировать. Т.е. из такого:

var data = [
  {
    alias: 'three',
    price: 100
  },
  {
    alias: 'two',
    price: 50
  },
  {
    alias: 'three',
    price: 100
  },
  {
    alias: 'three',
    price: 100
  },
  {
    alias: 'two',
    price: 50
  }
];

Нужно получить примерно такое:

[{
  alias: "three",
  val: 300
},
{
  alias: "two",
  val: 100
}]

Для lodash v4 все просто:

var result = _(data)
  .map('alias')
  .uniq()
  .map(alias => ({ 
    alias: alias, 
    val: _(data).filter({ alias: alias }).sumBy('price')
  }))
  .value();

В lodash v3 _.sumBy нет, поэтому обходимся встроенной _.sum:

var result = _(data)
  .map('alias')
  .uniq()
  .map(alias => ({ 
    alias: alias, 
    val: _.sum(_.pluck(_.filter(data, {alias: alias}), 'price'))
  }))
  .value();

Демо

lodash v3

JS Bin on jsbin.com

lodash v4

JS Bin on jsbin.com