1

很难理解_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 时仍然出现错误。

在此处输入图像描述

“更多”仅包含 vol_2009 -> vol_2011 的值

4

1 回答 1

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);
    });
});

或者,您不会在一个额外的步骤中执行此操作,而是在 group-by-each-property 函数中构建总和而不是数组。

于 2012-10-29T14:47:06.093 回答