Вопрос:

Суммируйте один и тот же объект массива

javascript

1578 просмотра

4 ответа

158 Репутация автора

var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];

Как сложить этот массив стал [ {id:1, qty:200}, {id:2, qty:400} ];

Спасибо.

Автор: Donny Gunawan Источник Размещён: 31.08.2015 08:34

Ответы (4)


5 плюса

41794 Репутация автора

Решение

Попробуй это:

var sum = [];

data.forEach(function(o) {
    var existing = sum.filter(function(i) { return i.id === o.id })[0];

    if (!existing)
        sum.push(o);
    else
        existing.qty += o.qty;
});

Смотри скрипку

Автор: haim770 Размещён: 31.08.2015 08:44

0 плюса

2055 Репутация автора

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

var temp = [];
temp.push(data[0])
for (x = 1; x < data.length; x++){
  for (i = 0; i < temp.length; i++){
    if (temp[i].id != data[x].id && temp[i].qty != data[x].qty ){
      temp.push[data[x]];
    }
  }
}
data = temp;
Автор: Nate May Размещён: 31.08.2015 09:12

1 плюс

6427 Репутация автора

С Ramda:

var f = R.compose(
    R.values(),
    R.mapObj(R.reduce(function(a,b) {return {'id': b.id, 'qty':a.qty+b.qty}}, {qty:0})),
    R.groupBy(R.prop('id'))
);

var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];

console.log(f(data));

http://jsfiddle.net/4496escu/2/

Автор: Benjamin Toueg Размещён: 31.08.2015 09:49

0 плюса

3083 Репутация автора

Вы можете сделать это, используя функциональный способ , с методами .reduce () и .map () .

В моем примере я сделал функцию, чтобы сделать процесс более общим.

  var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];

  function reducer(data, groupBy, reduceValue){
    //Reduce your data and initialize it with an empty object
    return [].concat.apply(data.reduce(function(hash, current){
      //If hash get current key, retrieve it and add sum property
      hash[current[groupBy]] = (hash[current[groupBy]] || 0) + current[reduceValue];
      //Return our current hash
      return hash;
    }, {})).map(function(elm){
      //Retrieve object keys
      return Object.keys(elm).map(function(key){
        //Build our object
        var obj = {};
        obj[groupBy] = +key;
        obj[reduceValue] = elm[key];
        return obj;
      });
    })[0];
  }

  console.log(reducer(data, 'id', 'qty'));
  //[ {id:1, qty:200}, {id:2, qty:400} ];

Эта функция принимает 3 аргумента

  • данные, которые будут уменьшены
  • параметр groupBy
  • ключ объекта для суммирования данных
Автор: Paul Boutes Размещён: 31.08.2015 10:27
Вопросы из категории :
32x32