[英]Change json into tree data by javascript
我有这样的数据。
[
{
"dbname": "db1",
"tblname": "tbl1",
"colname": "ID_1",
"RowCounts": "50"
},
{
"dbname": "db1",
"tblname": "tbl1",
"colname": "ID_2",
"RowCounts": "50"
}, {
"dbname": "db1",
"tblname": "tbl1",
"colname": "ID_3",
"RowCounts": "50"
},
{
"dbname": "db1",
"tblname": "tbl1",
"colname": "ID_4",
"RowCounts": "30"
},{
"dbname": "db1",
"tblname": "tbl2",
"colname": "ID_1",
"RowCounts": "20"
},{
"dbname": "db1",
"tblname": "tbl2",
"colname": "ID_2",
"RowCounts": "30"
},{
"dbname": "db1",
"tblname": "tbl2",
"colname": "ID_3",
"RowCounts": "10"
},{
"dbname": "db1",
"tblname": "tbl2",
"colname": "ID_4",
"RowCounts": "60"
},{
"dbname": "db1",
"tblname": "tbl2",
"colname": "ID_5",
"RowCounts": "30"
},{
"dbname": "db1",
"tblname": "tbl3",
"colname": "ID_6",
"RowCounts": "20"
}
]
我想转换成这种格式。
["name":"db1",
"rowcount":500, //sum of child row counts
"children":[
{"name":"tbl1",
"rowcount":200, //sum of children row counts
"children":[{
"name":"ID_1",
"rowcount":50
},{
"name":"ID_2",
"rowcount":50
}]},
{"name":"tbl2",
"rowcount":200,
"children":[{
}]}]}]
我怎样才能做到这一点? 我试过这个,但没有用。
我导入了 csv 文件,但它的结构不能很好地与树结构配合使用,所以我需要转换它。 它有 3 个字段,dbname、tblname 和 colname 以及行数。 只需将 rowcounts 视为值或其他东西。 只需要合并。
function createTreeData(structure) {
const node = (name, parent = null, row_cnt = 0) => ({
name,
parent,
row_cnt,
children: []
});
const addNode = (parent, child) => (parent.children.push(child), child);
const findNamed = (name, parent) => {
for (const child of parent.children) {
if (child.name === name) {
return child
}
const found = findNamed(name, child);
if (found) {
return found
}
}
}
const TOP_NAME = "Top",
top = node(TOP_NAME);
for (const children of structure) {
let par = top;
for (const name of children) {
const found = findNamed(name, par);
par = found ? found : addNode(par, node(name, par.name));
}
}
return top;
}
它创建树结构但不创建行数,并对其子项的行数求和。
任何帮助,将不胜感激。
您可以使用一组键来嵌套结构,减少此结构并将新对象添加到最内部的数组中。 在途中添加行数。
var data = [{ dbname: "db1", tblname: "tbl1", colname: "ID_1", RowCounts: "50" }, { dbname: "db1", tblname: "tbl1", colname: "ID_2", RowCounts: "50" }, { dbname: "db1", tblname: "tbl1", colname: "ID_3", RowCounts: "50" }, { dbname: "db1", tblname: "tbl1", colname: "ID_4", RowCounts: "30" }, { dbname: "db1", tblname: "tbl2", colname: "ID_1", RowCounts: "20" }, { dbname: "db1", tblname: "tbl2", colname: "ID_2", RowCounts: "30" }, { dbname: "db1", tblname: "tbl2", colname: "ID_3", RowCounts: "10" }, { dbname: "db1", tblname: "tbl2", colname: "ID_4", RowCounts: "60" }, { dbname: "db1", tblname: "tbl2", colname: "ID_5", RowCounts: "30" }, { dbname: "db1", tblname: "tbl3", colname: "ID_6", RowCounts: "20" }], keys = ['dbname', 'tblname', 'colname'], result = []; data.forEach(o => keys.reduce((p, k) => { var temp = (p.children = p.children || []).find(({ name }) => name === o[k]); if (!temp) p.children.push(temp = { name: o[k], rowcount: 0 }); temp.rowcount += +o.RowCounts; return temp; }, { children: result })); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
对于仅在叶子上添加行rowcount
,您可以采用旧方法并仅减少到最后一个嵌套级别,并将带有计数的对象添加到最终数组中。
您可以使用一组键来嵌套结构,减少此结构并将新对象添加到最内部的数组中。 在途中添加行数。
var data = [{ dbname: "db1", tblname: "tbl1", colname: "ID_1", RowCounts: "50" }, { dbname: "db1", tblname: "tbl1", colname: "ID_2", RowCounts: "50" }, { dbname: "db1", tblname: "tbl1", colname: "ID_3", RowCounts: "50" }, { dbname: "db1", tblname: "tbl1", colname: "ID_4", RowCounts: "30" }, { dbname: "db1", tblname: "tbl2", colname: "ID_1", RowCounts: "20" }, { dbname: "db1", tblname: "tbl2", colname: "ID_2", RowCounts: "30" }, { dbname: "db1", tblname: "tbl2", colname: "ID_3", RowCounts: "10" }, { dbname: "db1", tblname: "tbl2", colname: "ID_4", RowCounts: "60" }, { dbname: "db1", tblname: "tbl2", colname: "ID_5", RowCounts: "30" }, { dbname: "db1", tblname: "tbl3", colname: "ID_6", RowCounts: "20" }], keys = ['dbname', 'tblname'], result = data.reduce((r, o) => { keys .reduce((array, k) => { var temp = array.find(({ name }) => name === o[k]); if (!temp) array.push(temp = { name: o[k], children: [] }); return temp.children; }, r) .push({ name: o.colname, rowcount: +o.RowCounts }); return r; }, []); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.