试图了解Underscore库

时间:2012-10-29 13:26:19

标签: underscore.js

我很难理解_Underscore图书馆的基础知识,我认为我正在接受,但我认为这是一个给我带来问题的术语。

例如,我有以下对象:

CA3 "BAA"
vol_2007 0.15
vol_2008 0.2
vol_2009 0.25
vol_2010 0.3
vol_2011 0.600

CA3 "LUF"
vol_2007 1.13
vol_2008 0.4
vol_2009 1.6
vol_2010 2.8
vol_2011 0.43

我已经达到以下目的:

var fieldtogroup = 'CA3';

var groups = _.groupBy(tmp,function (name) { return name[fieldtogroup] });
var sums = _.map(groups, function (group) {
    return _.reduce(group, function (a, b) { return b; }, 0);
});

我遇到的第一个问题是,如果我使用:

return _.reduce(group, function (a, b) { return a + b; }, 0);

我得到一个垃圾垃圾,我可以看到_Underscore文档解释完美,'a'是当前值而'b'是新的,但这不起作用。有人可以解释为什么会这样吗?在进行计算之前,我是否需要函数中的子句来确定值是否为数值?

另外,最终,我希望能够返回类似于:

的对象数组
vol_2007: 0.15,1.13
vol_2008: 0.2,0.4
vol_2009: 0.25, 1.6
vol_2010: 0.3, 2.8
vol_2011: 0.600,0.43

我已经设法通过'有点'旋转对象,多次通过数组并将值推送到另一个数组但我很好_Underscore能够为我做这个但我无法理解如何。

如果有人可以通过这些来启发我,我真的很感激,我已经掌握了图书馆的基础知识,但这让我感到难过!

  • 编辑*

使用_.pluck命令解决了最后一个问题,这很棒,但在使用Reduce时仍然出错。

enter image description here

'more'只包含vol_2009的值 - > vol_2011

1 个答案:

答案 0 :(得分:2)

您正在对错误的对象应用总和减少。查看groups = _.groupBy(tmp, 'CA3')返回的内容:

{ // arrays of objects grouped by their CA3 property:
    BAA: [
        {
            CA3: "BAA",
            vol_2007: 0.15
            …
        },
        …
    ],
    Rum: [
        {
            CA3: "Rum",
            …
        }, {
            CA3: "Rum",
            …
        },
        …
    ],
    …
}

你无法对这些物体求和。

相反,您似乎想要通过属性名称再次对这些数组中的对象的属性值进行分组:

byCAandVol = _.map(groups, function(arr) {
    var res = {};
    for (var i=0; i<arr.length; i++)
        for (var prop in arr[i])
            if (prop != "CA3")
                if (prop in res)
                    res[prop].pus(arr[i][prop]);
                else
                    res[prop] = [arr[i][prop]];
    return res;
});

这有点像逐个属性。现在你已经

{ // arrays of objects grouped by their CA3 property:
    BAA: {
        vol_2007: [0.15, …],
        vol_2008: […]
        …
    },
    Rum: {
        vol_2007: …
    },
    …
}

现在,您可以使用reduce函数对这些数组求​​和,包含两个映射:

sumsByCAandVol = _.map(byCAandVol, function (group) {
    return _.map(group, function(vols) {
        return _.reduce(vols, function (a, b) { return a + b; }, 0);
    });
});

或者,你不是在额外的步骤中这样做,而是在逐个属性的函数中构建总和而不是数组。