1

只是刚刚介绍给_Underscore,所以这可能完全是胡说八道,但我想知道图书馆是否真的可以做我想做的事。

我有一个包含 5 个项目的对象:

Name, v2007,v2008,v2009,v2010

我只是想遍历整个对象并获取其中每个不同值的 SUM 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 ,实际上我不确定如何检索字段的 SUM v2011v2013除了对它们进行硬编码,这根本不切实际!

有人可以在这里帮助我吗,有没有一种简单的方法可以让 _Underscore 库基于名称组对所有字段进行求和(例如,以“v”开头)?

4

2 回答 2

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);
});
于 2012-10-26T13:20:39.903 回答
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 循环使用下划线。

于 2014-01-06T18:46:48.030 回答