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を使用するとエラーが発生します。

ここに画像の説明を入力してください

'more'には、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: …
    },
    …
}

これで、2つのマッピングにラップされた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 に答える