GroupBy和CountBy用于​​多个值

时间:2013-07-29 08:46:34

标签: group-by underscore.js

我正在尝试使用underscorejs根据以下数据对多个值进行分组。

var obj = [
        {
            'Name': 'A',
            'Status': 'Ticket Closed'
        },{
            'Name': 'B',
            'Status': 'Ticket Open To Close'
        },{
            'Name': 'A',
            'Status': 'Ticket Closed'
        },{
            'Name': 'B',
            'Status': 'Ticket Open'
        },{
            'Name': 'A',
            'Status': 'Ticket Open To Closed'
        },{
            'Name': 'A',
            'Status': 'Ticket Open'
        },{
            'Name': 'B',
            'Status': 'Ticket Open'
        }
    ];

预期输出

[{
    'Name': Closed',
    'Count': [2, 0]
},{
    'Name': Open',
    'Count': [2, 3]
}]

第一个对象同时计算A和B的所有已关闭的票证(其中状态包含单词已关闭)。类似地,第二个对象计为Open票证。这是我试过的

var arr = _.groupBy(obj, function (row) {
    return (row["Status"].indexOf('Open') > 0 ? "Open" : "Closed");
});

var arr1 = _.groupBy(arr["Closed"], 'Name');
var arr2 = _.groupBy(arr["Open"], 'Name');

var cData = [];
cData.push(arr1);
cData.push(arr2);

无法从相同的代码获取计数。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

确定。所以我能够解决这个问题。这是工作示例

http://jsfiddle.net/7ETKV/

以下是已解决的代码:

var jsondata = jsondata.sort(function (a, b) {
    return a.Name.localeCompare(b.Name);
});
_.each(jsondata, function (row, idx) {
    ((row.Status.indexOf('Open') > 0) ? jsondata[idx].bgStatus = 'Open' : jsondata[idx].bgStatus = 'Closed');
});

var cdata = [], xobj = {};
var gd = _.groupBy(jsondata, 'bgStatus');
var cats = _.keys(_.groupBy(jsondata, 'Name'));

for (var p in gd) {
    var arr = _.countBy(gd[p], function (row) {
        return row.Name;
    });

    _.each(cats, function (row) {
        if (!arr.hasOwnProperty(row)) arr[row] = 0;
    });

    xobj.Name = p;
    xobj.Data = _.values(arr);

    cdata.push(xobj);
    xobj = {};
}

希望可能对某人有所帮助。欢迎对代码/优化进行任何更新。