我有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到目前为止,我所做的是我得到了所有独特的专业和集团。
然后我环顾了所有的数据,并比较了是否有匹配的专业和集团。
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?
}
}
}
}如果有匹配,则创建一个数组,在其中推送状态和计数。
但我真的不知道怎么从那里开始。
谢谢你的帮助!
发布于 2016-05-19 14:19:19
假设数据是一个数组,其对象如下,
{ 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进行了评估。
对象一个da返回值/ 在数据的第一个循环之后的 {“渔夫”:{ "6":{“接受报价”:{“计数”:1}
综述:reduce返回一些高度可控的内容。
发布于 2016-05-19 14:08:50
试试这个:
var result = new Array();
for(var d in data){
if(result[d.profession] == 'undefined'){
result[d.profession] = new Array();
}
if(result[d.profession][d.group] == 'undefined'){
result[d.profession][d.group] = new Array();
}
result[d.profession][d.group][d.status] = d.count;
}
result = JSON.stringify(result);//convert array to json
console.log(result);我没有测试它,我假设您的JSON数据在数据变量中
发布于 2016-05-19 14:21:03
您可以很容易地减少以下操作:
const result = data.reduce((result, row) => {
ensureKeyExists(result, row.Profession);
ensureKeyExists(result[row.Profession], row.Group);
result[row.Profession][row.Group][row.Status] = row.Count;
return result;
}, {});
function ensureKeyExists(object, key, defaultVal = {}) {
if (!object[key]) {
object[key] = defaultVal;
}
}https://stackoverflow.com/questions/37325497
复制相似问题