使用Underscore在Javascript对象中的不同之处

时间:2012-10-26 11:42:58

标签: javascript underscore.js

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

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

Name, v2007,v2008,v2009,v2010

我只想浏览整个对象并获取Name中每个不同值的SUM(非常类似于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,实际上我不确定如何检索字段v2011v2013的SUM,而不是硬编码它们在哪个根本不实用!< / p>

有人可以在这里帮助我一点,有没有一种简单的方法可以让_Underscore库根据一个名称组获取所有字段(例如,以'v'开头)?

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分: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循环。