将平面JSON文件转换为分层json数据,如flare.json
在一场麻烦的战斗后,我几乎想到了如何将平面json文件转换为Hierarchical文件。 我没有自己编写这个函数。 我从下面的post中复制了它。
D3 JSON数据转换
但现在问题是,在post中写的函数只有2级层次结构。 但我正在寻找4级层次结构。 我试图覆盖我失败的function但是。
代码与我正在尝试。
var data = [ {“dep”:“First Top”,“name”:“First child”,“model”:“value1”,“size”:“320”}, {“dep”:“First Top”,“name”:“First child”,“model”:“value2”,“size”:“320”}, {“dep”:“First Top”,“name”:“First child”,“model”:“value3”,“size”:“320”}, {“dep”:“First Top”,“name”:“First child”,“model”:“value4”,“size”:“320”}, {“dep”:“First Top”,“name”:“SECOND CHILD”,“model”:“value1”,“size”:“320”}, {“dep”:“First Top”,“name”:“SECOND CHILD”,“model”:“value2”,“size”:“320”}, {“dep”:“First Top”,“name”:“SECOND CHILD”,“model”:“value3”,“size”:“320”}, {“dep”:“First Top”,“name”:“SECOND CHILD”,“model”:“value4”,“size”:“320”}, {“dep”:“Second Top”,“name”:“First Child”,“model”:“value1”,“size”:“320”}, {“dep”:“Second Top”,“name”:“First Child”,“model”:“value2”,“size”:“320”}, {“dep”:“Second Top”,“name”:“First Child”,“model”:“value3”,“size”:“320”}, {“dep”:“Second Top”,“name”:“First Child”,“model”:“value4”,“size”:“320”}, {“dep”:“Second Top”,“name”:“SECOND CHILD”,“model”:“value1”,“size”:“320”}, {“dep”:“Second Top”,“name”:“SECOND CHILD”,“model”:“value2”,“size”:“320”}, {“dep”:“Second Top”,“name”:“SECOND CHILD”,“model”:“value3”,“size”:“320”}, {“dep”:“Second Top”,“name”:“SECOND CHILD”,“model”:“value4”,“size”:“320”}, {“dep”:“Third Top”,“name”:“First Child”,“model”:“value2”,“size”:“320”}, {“dep”:“Third Top”,“name”:“First Child”,“model”:“value3”,“size”:“320”}, {“dep”:“Third Top”,“name”:“First Child”,“model”:“value4”,“size”:“320”}, {“dep”:“Third Top”,“name”:“First Child”,“model”:“value5”,“size”:“320”}, {“dep”:“Third Top”,“name”:“Second Child”,“model”:“value1”,“size”:“320”}, {“dep”:“Third Top”,“name”:“Second Child”,“model”:“value2”,“size”:“320”}, {“dep”:“Third Top”,“name”:“Second Child”,“model”:“value3”,“size”:“320”}, {“dep”:“Third Top”,“name”:“Second Child”,“model”:“value4”,“size”:“320”} ] var newData = {“name”:“root”,“children”:{}} data.forEach(函数(d){ if(typeof newData.children [d.dep]!=='undefined'){ newData.children [d.dep] .children.push(d) } else { newData.children [d.dep] = {“name”:d.dep,“children”:[{“name”:d.name,“children”:[{“name”:d.model,“size”: d.size}]}]} } }) newData.children = Object.keys(newData.children).map(function(key){return newData.children [key];}); //显示我们得到了什么 d3.select( '主体')。附加( '前') .text(JSON.stringify(newData,null,''));
输出当前代码
{ “名字”:“根”, “孩子们”:[ { “名字”:“第一名”, “孩子们”:[ { “名字”:“第一个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” } ] }, { “dep”:“First Top”, “名字”:“第一个孩子”, “模特”:“价值2”, “尺寸”:“320” }, { “dep”:“First Top”, “名字”:“第一个孩子”, “模特”:“价值3”, “尺寸”:“320” }, { “dep”:“First Top”, “名字”:“第一个孩子”, “模特”:“价值4”, “尺寸”:“320” }, { “dep”:“First Top”, “名字”:“第二个孩子”, “model”:“value1”, “尺寸”:“320” }, { “dep”:“First Top”, “名字”:“第二个孩子”, “模特”:“价值2”, “尺寸”:“320” }, { “dep”:“First Top”, “名字”:“第二个孩子”, “模特”:“价值3”, “尺寸”:“320” }, { “dep”:“First Top”, “名字”:“第二个孩子”, “模特”:“价值4”, “尺寸”:“320” } ] }, { “名字”:“第二名”, “孩子们”:[ { “名字”:“第一个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” } ] }, { “dep”:“第二名”, “名字”:“第一个孩子”, “模特”:“价值2”, “尺寸”:“320” }, { “dep”:“第二名”, “名字”:“第一个孩子”, “模特”:“价值3”, “尺寸”:“320” }, { “dep”:“第二名”, “名字”:“第一个孩子”, “模特”:“价值4”, “尺寸”:“320” }, { “dep”:“第二名”, “名字”:“第二个孩子”, “model”:“value1”, “尺寸”:“320” }, { “dep”:“第二名”, “名字”:“第二个孩子”, “模特”:“价值2”, “尺寸”:“320” }, { “dep”:“第二名”, “名字”:“第二个孩子”, “模特”:“价值3”, “尺寸”:“320” }, { “dep”:“第二名”, “名字”:“第二个孩子”, “模特”:“价值4”, “尺寸”:“320” } ] }, { “名字”:“第三名”, “孩子们”:[ { “名字”:“第一个孩子”, “孩子们”:[ { “name”:“value2”, “尺寸”:“320” } ] }, { “dep”:“第三名”, “名字”:“第一个孩子”, “模特”:“价值3”, “尺寸”:“320” }, { “dep”:“第三名”, “名字”:“第一个孩子”, “模特”:“价值4”, “尺寸”:“320” }, { “dep”:“第三名”, “名字”:“第一个孩子”, “模特”:“价值5”, “尺寸”:“320” }, { “dep”:“第三名”, “名字”:“第二个孩子”, “model”:“value1”, “尺寸”:“320” }, { “dep”:“第三名”, “名字”:“第二个孩子”, “模特”:“价值2”, “尺寸”:“320” }, { “dep”:“第三名”, “名字”:“第二个孩子”, “模特”:“价值3”, “尺寸”:“320” }, { “dep”:“第三名”, “名字”:“第二个孩子”, “模特”:“价值4”, “尺寸”:“320” } ] } ] }
期望的输出格式:
{ “名字”:“根”, “孩子们”:[ { “名字”:“第一名”, “孩子们”:[ { “名字”:“第一个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” }, { “name”:“value2”, “尺寸”:“320” }, { “名字”:“value3”, “尺寸”:“320” }, { “名字”:“value4”, “尺寸”:“320” } ] }, { “名字”:“第二个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” }, { “name”:“value2”, “尺寸”:“320” }, { “名字”:“value3”, “尺寸”:“320” }, { “名字”:“value4”, “尺寸”:“320” } ] }, ] }, { “名字”:“第二名”, “孩子们”:[ { “名字”:“第一个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” }, { “name”:“value2”, “尺寸”:“320” }, { “名字”:“value3”, “尺寸”:“320” }, { “名字”:“value4”, “尺寸”:“320” } ] }, { “名字”:“第二个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” }, { “name”:“value2”, “尺寸”:“320” }, { “名字”:“value3”, “尺寸”:“320” }, { “名字”:“value4”, “尺寸”:“320” } ] }, ] }, { “名字”:“第三名”, “孩子们”:[ { “名字”:“第一个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” }, { “name”:“value2”, “尺寸”:“320” }, { “名字”:“value3”, “尺寸”:“320” }, { “名字”:“value4”, “尺寸”:“320” } ] }, { “名字”:“第二个孩子”, “孩子们”:[ { “name”:“value1”, “尺寸”:“320” }, { “name”:“value2”, “尺寸”:“320” }, { “名字”:“value3”, “尺寸”:“320” }, { “名字”:“value4”, “尺寸”:“320” } ] }, ] } ] }
我从一个星期开始,但我一个人无法理解。 有人请修改函数,以便在我更新时以分层格式获取数据。
提前致谢!!
更新为使用递归方法
这应该适用于n
级而不仅仅是2级或3级。您只需指定哪些属性定义哪些级别。
var data = [ { "dep": "First Top", "name": "First child", "model": "value1", "size": "320" }, { "dep": "First Top", "name": "First child", "model": "value2", "size": "320" }, { "dep": "First Top", "name": "SECOND CHILD", "model": "value1", "size": "320" }, { "dep": "Second Top", "name": "First Child", "model": "value1", "size": "320" } ]; var newData = { name :"root", children : [] }, levels = ["dep","name"]; // For each data row, loop through the expected levels traversing the output tree data.forEach(function(d){ // Keep this as a reference to the current level var depthCursor = newData.children; // Go down one level at a time levels.forEach(function( property, depth ){ // Look to see if a branch has already been created var index; depthCursor.forEach(function(child,i){ if ( d[property] == child.name ) index = i; }); // Add a branch if it isn't there if ( isNaN(index) ) { depthCursor.push({ name : d[property], children : []}); index = depthCursor.length - 1; } // Now reference the new child array as we go deeper into the tree depthCursor = depthCursor[index].children; // This is a leaf, so add the last element to the specified branch if ( depth === levels.length - 1 ) depthCursor.push({ name : d.model, size : d.size }); }); });
var data = [ { "state": "UP", "district": "Agra", "block": "IradatNagar","school":"APS","name":"A" }, { "state": "UP", "district": "Agra", "block": "IradatNagar","school":"IPS","name":"B" }, { "state": "UP", "district": "Agra", "block": "IradatNagar","school":"APS","name":"C" }, { "state": "MP", "district": "Bhopal", "block": "chota_Bhopal","school":"DPS","name":"D" }, { "state": "UP", "district": "Mathura", "block": "Farah","school":"HPS","name":"E" }, { "state": "UP", "district": "Kanpur", "block": "Mania","school":"BPs","name":"F" }, { "state": "UP", "district": "Agra", "block": "Arjun Nagar","school":"GPS","name":"G" }, { "state": "MP", "district": "Gwalior", "block": "Surya Nagar","school":"DPS","name":"H" } ]; var newData = { name :"State", children : [] }, levels = ["state","district","block","school"]; data.forEach(function(d){ var depthCursor = newData.children; levels.forEach(function( property, depth ) { var index; depthCursor.forEach(function(child,i) { if ( d[property] == child.name ) index = i; }); if ( isNaN(index) ) { depthCursor.push({name : d[property], children : []}); index = depthCursor.length - 1; } depthCursor = depthCursor[index].children; if ( depth === levels.length - 1 ) { depthCursor.push({ name : d.name}); } }); }); console.log(newData);