首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点:计算“累计”总数

节点:计算“累计”总数
EN

Stack Overflow用户
提问于 2015-06-22 00:57:52
回答 1查看 166关注 0票数 0

我有这样的数据结构,数组中的每个对象都带有一个数字--在我的例子中是一个"num“属性。那么,在节点中是否有一种更简单的方法(比我下面所做的那样)来为每个对象计算一个数字,即它前面的所有数字的父数组的值?

代码语言:javascript
复制
_ = 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个数组组成的数组。

代码语言:javascript
复制
var obj = _.chain(data)
       .groupBy('name')
       .map(function ( value) {
          return _.sortBy(value, 'num');
       }).value();

除了在另一个循环(每个循环)中的一个长循环(每个循环)之外,还有更简单的方法来完成这个任务吗?对于每个对象,我需要得到它之前的对象的总值,或者在第一个对象的情况下为0?

代码语言:javascript
复制
_.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);

...to得到了以下信息:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-22 02:29:19

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

代码语言:javascript
复制
_.each(obj, function(subArr){
  _.reduce(subArr, function(total, currentObj) {
    return currentObj.basis = (total += currentObj.num); 
  }, 0);
});

我确信有更聪明的解决方案,但是对于子数组,我认为不使用forEach是无法逃脱的,至少在没有不必要的复杂的情况下是不可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30970846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档