我有来自CSV的数据:

Group   Profession  Status          Count
6       Fisherman   Offer Accepted  1
6       Fisherman   All             1
7       Fisherman   Offer Accepted  1
7       Fisherman   All             1
8       Banker      Onboard         2
8       Banker      All             2
8       Cook        Onboard         4
8       Cook        All             4
8       Developer   Onboard         2
8       Developer   All             2
9       Banker      Onboard         2
9       Banker      Offer Accepted  1
9       Banker      All             3


我需要将其作为JSON数组返回:

"Fisherman" : {
    6 : {
        "Offer Accepted" : 1,
        "All" : 1
    },
    7 : {
        "Offer Accepted" : 1,
        "All" : 1
    }
},
"Banker" : {
    8 : {
        "Onboard" : 2,
        "All" : 2
    },
    9 : {
        "Onboard" : 2,
        "Offer Accepted" : 1,
        "All" : 3
    }
},
....so on


到目前为止,我所做的就是获得了所有独特的行业和团队。

然后,我遍历了所有数据并比较了Profession AND Group是否匹配。

for(var d in data) {
    var json = [];
    for(var p in profession) {
        for(var g in group) {
            if(data[d]["Profession"] == profession[p] && data[d]["Group"] == group[g]) {
                json.push({data[d]["Status"] : data[d]["Count"]});
                // put 'json' variable in JSON array with key group?
            }
        }
    }
}


如果存在匹配项,我创建了一个数组,在其中推送了状态和计数。

但是我真的不知道该怎么做。

谢谢您的帮助!

最佳答案

假设数据是一个包含对象的数组,

{ Group: 6, Profession: 'Fisherman', Status: 'Offer Accepted', Count: 1 }


那么您可以使用以下内容

var order = ['Profession', 'Group', 'Status'],
    object = {};

data.forEach(function (d) {
    order.reduce(function (r, a) {
        r[d[a]] = r[d[a]] || {};
        return r[d[a]];
    }, object).Count = d.Count;
});



  怎么运行的:
  
  d是具有上述结构的对象。 oder是一个数组,其键的结果顺序为object的所需顺序。 (我将json重命名为object,因为JSON是具有特殊格式的字符串,而不是对象,就像这里需要的那样。)
  
  对于计数分配,有必要知道属性的路径。通过对order迭代实际对象d的键来授予此权限。


r[d[a]] = r[d[a]] || {};


使用此d[a]检查属性是否存在以及是否不分配空对象。

在回调的末尾,返回对最后一个对象r[d[a]]的引用。

最后,将新属性Count赋值为d.Count


object                       a          d[a]           return value
---------------------------- ---------- -------------- ------------
{}                           Profession Fisherman      {}
                /--------------------------------------/            (same reference)
{ "Fisherman": {} }          Group      6              {}
                       /-------------------------------/            (same reference)
{ "Fisherman": { "6": {} } } Status     Offer Accepted {}

  
  第一次数据循环后的对象

{
    "Fisherman": {
        "6": {
            "Offer Accepted": {
                "Count": 1
            }
        }
    }
}



综述:reduce返回一些可高度控制的内容。

07-26 09:21
查看更多