1

_Underscoreを紹介したばかりなので、これはまったくナンセンスかもしれませんが、ライブラリが実際に私が望むことを実行できるかどうか疑問に思っています。

私は5つのアイテムを含むオブジェクトを持っています:

Name, v2007,v2008,v2009,v2010

オブジェクト全体を調べて、それぞれの個別の値の SUM を取得したいだけですName(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);
});

v2011これは常に 0 を返します。実際、フィールドのSUM を取得する方法がわかりません。ただし、v2013それらをハードコーディングするのは実用的ではありません。

名前のグループに基づいて、_Underscore ライブラリですべてのフィールド (つまり、「v」で始まる) を合計する簡単な方法はありますか?

4

2 に答える 2

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);
});
于 2012-10-26T13:20:39.903 に答える
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 ループに名目上のみアンダースコアを使用します。

于 2014-01-06T18:46:48.030 に答える