只是刚刚介绍给_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,实际上我不确定如何检索字段v2011
,v2013
的SUM,而不是硬编码它们在哪个根本不实用!< / p>
有人可以在这里帮助我一点,有没有一种简单的方法可以让_Underscore库根据一个名称组获取所有字段(例如,以'v'开头)?
答案 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循环。