2012-10-26 36 views
1

只是剛剛介紹給_Underscore,所以這可能完全是無稽之談,但我想知道庫是否確實可以做我想做的。使用下劃線的Javascript對象中的差異總和

我有一個包含5個項目的對象:

Name, v2007,v2008,v2009,v2010 

我只是想通過整個對象和Name讓每個不同的值的總和(非常類似於SQL的的GroupBy和SUM)。

我有以下幾點:

var distincts = []; 
$.each(tmp, function (key, value) { 
    $.each(value, function (fieldName, fieldValue) { 
     if (fieldName == 'Name') { 
      if ($.inArray(fieldValue, distincts) == -1) { 
       distincts.push(fieldValue); 
      } 
     } 
    }); 
}); 

$.each(distincts, function (a, b) { 
    var t = _.where(tmp, {Name: b}); 
    var sum = _.reduce(t.v2007, function (memo, num) { 
     return memo + num; 
    }, 0) 
    console.log(sum); 
}); 

這是返回0的時候,其實我不知道如何檢索領域v2011的總和,v2013比其他硬編碼它們在其中根本不實用!

有人可以幫助我一點,有沒有一種簡單的方法讓_Underscore庫SUM基於名稱組的所有字段(即,以'v'開頭)?

+0

你能告訴我們一個'tmp'對象(JSON格式)嗎?順便說一句,你不應該混合Underscore和jQuery的'each'功能 – Bergi

回答

3

我想這你想要做什麼:

var groups = _.groupBy(function(name) { return name.charAt(0) }); 
var sums = _.map(groups, function(group) { 
    return _.reduce(group, function (a, b) { return a+b; }, 0); 
}); 
+0

幫了很多,謝謝。 – JasonMHirst

+0

沒有冒犯,但不應該有更簡單的方法來做到這一點與下劃線? – Jess

+1

@Jess:我不這麼認爲,Underscore不是查詢語言,而是一些功能助手的工具集。我發現一個更簡單的方法,請提供另一個答案:-) – Bergi

1

這是一種方法,我想出了將對象的數組,並返回一個對象,其中對象的「鑰匙」的分組值與所述對象的 「值」 是彙總值:

function groupBy(input, xCol, yCol) { 

    var output = {}; 

    // This function can be easily changed to do max, min, avg, sum. 
    var sum = function(row, idx) { 
     if (!(row[xCol] in output)) { 
      output[row[xCol]] = row[yCol]; 
     } 
     else { 
      output[row[xCol]] += row[yCol];   
     } 
    }; 
    _.each(input, sum); 

    return output; 
} 

和測試:

var input = [ { 
    pn : "M1", 
    date : "2014-01-01T00:00:00Z", 
    qty : 1 
}, { 
    pn : "M1", 
    date : "2014-01-01T00:00:00Z", 
    qty : .5 
}, { 
    pn : "M2", 
    date : "2014-01-04T00:00:00Z", 
    qty : 2 
} ]; 

it('should group by abc value, showing max.', function() { 
    expect(groupBy(input, "pn", "qty")).toEqual({ 
     "M1" : 1.5, 
     "M2" : 2 
    }); 
}); 

這個答案只在名義上爲foreach循環使用下劃線。

+0

你認爲@Bergi怎麼樣? – Jess