我有来自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
返回一些可高度控制的内容。