2015-06-22 153 views
0

我有這樣的數據結構,其中數組中的每個對象都帶有一個數字 - 在我的情況下是一個「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

+0

輸出中每個名字的第一個數字似乎是錯誤的。無論如何,如果您在保存值的地方更改數據結構,則最容易改進。數據來自哪裏? – maraca

回答

0

這裏是使用reduce的解決方案。 (當談到積累循環中的價值,降低往往是一個好主意。)

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

我敢肯定有更聰明的解決方案,但與子陣,我不認爲你可以逃脫不使用forEach,至少不是沒有不必要的複雜。