我正在努力从字典/数组列表中创建嵌套结构。 我有数据,我需要用它来构建一个JSON-ish对象。
var data = [
{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV1","Amt":100, "Sales Person":"S1"},
{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV2","Amt":200, "Sales Person":"S1"},
{"Customer":"C2", "Code":"0002","Sales Invoice":"SINV3","Amt":200, "Sales Person":"S1"},
{"Customer":"C3", "Code":"0003","Sales Invoice":"SINV4","Amt":100, "Sales Person":"S2"},
{"Customer":"C4", "Code":"0004","Sales Invoice":"SINV5","Amt":300, "Sales Person":"S2"}
];
预期产出:
[{
"Sales Person": "S1",
"Data": [{
"Customer": "C1",
"Data": [{
"Sales Invoice": "SINV1",
"Amt": 100
},
{
"Sales Invoice": "SINV2",
"Amt": 200
}
],
"Code": "0001"
},
{
"Customer": "C2",
"Data": [{
"Sales Invoice": "SINV3",
"Amt": 200
}],
"Code": "0001"
}
]
},
{
"Sales Person": "S2",
"Data": [{
"Customer": "C3",
"Data": [{
"Sales Invoice": "SINV4",
"Amt": 100
}],
"Code": "0003"
},
{
"Customer": "C4",
"Data": [{
"Sales Invoice": "SINV4",
"Amt": 300
}],
"Code": "0004"
}
]
}
]
提前感谢您的帮助。
答案 0 :(得分:0)
您可以使用reduce
来整理/汇总数据
并使用map
对其进行格式化。
var data = [{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV1","Amt":100, "Sales Person":"S1"},{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV2","Amt":200, "Sales Person":"S1"}, {"Customer":"C2", "Code":"0002","Sales Invoice":"SINV3","Amt":200, "Sales Person":"S1"}, {"Customer":"C3", "Code":"0003","Sales Invoice":"SINV4","Amt":100, "Sales Person":"S2"},{"Customer":"C4", "Code":"0004","Sales Invoice":"SINV5","Amt":300, "Sales Person":"S2"}];
var newData = Object.values(data.reduce((c,v)=>{
c[v["Sales Person"]] = c[v["Sales Person"]] || {"Sales Person" : v["Sales Person"], "Data" : {}};
c[v["Sales Person"]]["Data"][ v["Code"] ] = c[v["Sales Person"]]["Data"][ v["Code"] ] || { Customer : v["Customer"],"Data": [], Code: v["Code"] }
c[v["Sales Person"]]["Data"][ v["Code"] ].Data.push( {"Sales Invoice": v["Sales Invoice"],"Amt": v["Amt"]} );
return c;
},{})).map(v=>{
v.Data = Object.values( v.Data );
return v;
});
console.log( newData );
答案 1 :(得分:0)
您可以将array#reduce
与Object.values()
一起使用。首先根据Sales Person
对数据进行分组,然后使用Customer
值对其进行分组。然后使用array#forEach
提取Customer
中的所有Data
值。
var data = [{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV1","Amt":100, "Sales Person":"S1"},{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV2","Amt":200, "Sales Person":"S1"},{"Customer":"C2", "Code":"0002","Sales Invoice":"SINV3","Amt":200, "Sales Person":"S1"},{"Customer":"C3", "Code":"0003","Sales Invoice":"SINV4","Amt":100, "Sales Person":"S2"},{"Customer":"C4", "Code":"0004","Sales Invoice":"SINV5","Amt":300, "Sales Person":"S2"}];
var result = Object.values(data.reduce((r,o) => {
r[o['Sales Person']] = r[o['Sales Person']] || {'Sales Person' : o['Sales Person'], Data : {} };
r[o['Sales Person']].Data[o.Customer] = r[o['Sales Person']].Data[o.Customer] || {Data: [], Code: o.Code}
r[o['Sales Person']].Data[o.Customer].Data.push({'Sales Invoice': o['Sales Invoice'], Amt : o['Amt']});
return r;
},{}));
result.forEach(o => {
o.Data = Object.values(o.Data);
});
console.log(result);