【问题标题】:Node: compute "cumulative" total节点:计算“累积”总计
【发布时间】:2015-09-07 08:48:42
【问题描述】:

我有这个数据结构,其中数组中的每个对象都带有一个数字——在我的例子中是一个“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();

除了在另一个循环(每个)内的长 for 循环之外,还有更简单的方法吗?.. 对于每个对象,我需要获取它之前的对象的总值,或者在以下情况下为 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);

...得到这个:

【问题讨论】:

  • 输出中每个名称的第一个数字似乎是错误的。无论如何,如果您更改保存值的数据结构,则最容易改进。数据从何而来?

标签: arrays node.js loops


【解决方案1】:

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

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

我确信有更聪明的解决方案,但是对于子数组,我认为不使用 forEach 就无法逃脱,至少不会使事情变得不必要的复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2020-12-17
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多