0

我正在尝试使用 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);

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

4

1 回答 1

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 = {};
}

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

于 2013-07-30T06:34:35.283 回答