节点:计算"累积"总

时间:2015-06-22 00:57:52

标签: arrays node.js loops

我有这样的数据结构,其中数组中的每个对象都带有一个数字 - a" num"我的财产。那么节点中是否有一种更简单的方法(比我在下面所做的那样)计算每个对象的数字,这个数字是它之前的父数组的所有数字的值?

_ = require('underscore');

_.nst = require('underscore.nest');

var data = [
    {'name' : 'name 1', 'num' : 40},
    {'name' : 'name 1', 'num' : 20},
    {'name' : 'name 2', 'num' : 10},
    {'name' : 'name 2', 'num' : 50},
    {'name' : 'name 2', 'num' : 40},
    {'name' : 'name 2', 'num' : 70},
    {'name' : 'name 2', 'num' : 30}
];

这给了我一个包含2个数组的数组

var obj = _.chain(data)
       .groupBy('name')
       .map(function ( value) {
          return _.sortBy(value, 'num');
       }).value();

除了在另一个循环(每个)内部的长循环之外,还有一种更简单的方法吗?对于每个对象,我需要获取前面的对象的总值,或者在0的情况下第一个对象?...

_.each(obj, function(value){ 
  //loop through each array in obj
  for(var i=0; i<value.length; i++){
    if (i !== 0 && i > 1) {
      value[i].basis = value[i].num + value[i-1].basis;
    } else if (i === 1) {
      value[i].basis = value[i].num + value[i-1].num;
    } else {
      value[i].basis = 0;
    }
  }
});

console.log(obj);

...得到这个: enter image description here

1 个答案:

答案 0 :(得分:0)

这是使用reduce的解决方案。 (当涉及在循环中累积值时,reduce通常是个好主意。)

_.each(obj, function(subArr){
  _.reduce(subArr, function(total, currentObj) {
    return currentObj.basis = (total += currentObj.num); 
  }, 0);
});

我确信有更聪明的解决方案,但是对于子阵列我不认为你可以在不使用forEach的情况下逃脱,至少不会让事情变得不必要的复杂。