如何在Javascript中生成分层json数据

如何在Javascript中生成分层json数据,javascript,json,Javascript,Json,我有一个带有父子关系的Json原始数据。我想用父ID从平面生成分层Json。我试过下面的代码,它工作正常,但我想知道如果子对象中没有数据,如何删除children[]对象 var arry = [ { Id: "1", Name: "abc", Parent: "", attr: "abc" }, { Id: "2", Name: "abc", Parent: "1", attr: "abc" }, { Id: "3", Name: "abc", Parent: "2", attr:

我有一个带有父子关系的Json原始数据。我想用父ID从平面生成分层Json。我试过下面的代码,它工作正常,但我想知道如果子对象中没有数据,如何删除
children[]
对象

var arry = [
  { Id: "1", Name: "abc", Parent: "", attr: "abc" },
  { Id: "2", Name: "abc", Parent: "1", attr: "abc" },
  { Id: "3", Name: "abc", Parent: "2", attr: "abc" },
  { Id: "4", Name: "abc", Parent: "2", attr: "abc" },
];

function convert(array) {
  var map = {};
  for (var i = 0; i < array.length; i++) {
    var obj = array[i];
    obj.children = [];

    map[obj.Id] = obj;

    var parent = obj.Parent || "-";
    if (!map[parent]) {
      map[parent] = {
        children: [],
      };
    }
    map[parent].children.push(obj);
  }

  return map["-"].children;
}

var r = convert(arry);
console.log("array", r);
console.log("result", JSON.stringify(r));
var arry=[
{Id:“1”,名称:“abc”,父项:,属性:“abc”},
{Id:“2”,姓名:“abc”,家长:“1”,属性:“abc”},
{Id:“3”,姓名:“abc”,家长:“2”,属性:“abc”},
{Id:“4”,姓名:“abc”,家长:“2”,属性:“abc”},
];
函数转换(数组){
var-map={};
对于(var i=0;i
我觉得可能有更好的方法,但我们还是遍历
映射
属性,删除那些子数组为空的属性吧

var arry=[
{Id:“1”,名称:“abc”,父项:,属性:“abc”},
{Id:“2”,姓名:“abc”,家长:“1”,属性:“abc”},
{Id:“3”,姓名:“abc”,家长:“2”,属性:“abc”},
{Id:“4”,姓名:“abc”,家长:“2”,属性:“abc”},
];
函数转换(数组){
var-map={};
对于(var i=0;ilog(“result”,JSON.stringify(r))
我觉得可能有更好的方法,但我们还是遍历
映射
属性并删除带有空子数组的属性吧

var arry=[
{Id:“1”,名称:“abc”,父项:,属性:“abc”},
{Id:“2”,姓名:“abc”,家长:“1”,属性:“abc”},
{Id:“3”,姓名:“abc”,家长:“2”,属性:“abc”},
{Id:“4”,姓名:“abc”,家长:“2”,属性:“abc”},
];
函数转换(数组){
var-map={};
对于(var i=0;ilog(“result”,JSON.stringify(r))
O(n)

const源=[
{Id:“1”,名称:“abc”,父项:,属性:“abc”},
{Id:“2”,姓名:“abc”,家长:“1”,属性:“abc”},
{Id:“3”,姓名:“abc”,家长:“2”,属性:“abc”},
{Id:“4”,姓名:“abc”,家长:“2”,属性:“abc”},
];
功能树(数据、id、pId){
const[结果]=data.reduce(
([r,地图],项目)=>{
常量d={…项,子项:[]};
const loc=map[项目[pId]];
国际单项体育联合会(loc){
位置:儿童推(d);
}否则{
r、 推(d);
}
映射[项目[id]]=d;
返回[r,map];
},
[[], {}]
);
返回结果;
}
//log(JSON.stringify(tree(source,“Id”,“Parent”),null,4);
document.querySelector(“pre”).innerHTML=JSON.stringify(tree(source,“Id”,“Parent”),null,4)
。作为控制台{
最小高度:100%!重要;
}
.作为控制台行{
颜色:蓝色!重要;
}
.code{

O(n)

const源=[
{Id:“1”,名称:“abc”,父项:,属性:“abc”},
{Id:“2”,姓名:“abc”,家长:“1”,属性:“abc”},
{Id:“3”,姓名:“abc”,家长:“2”,属性:“abc”},
{Id:“4”,姓名:“abc”,家长:“2”,属性:“abc”},
];
功能树(数据、id、pId){
const[结果]=data.reduce(
([r,地图],项目)=>{
常量d={…项,子项:[]};
const loc=map[项目[pId]];
国际单项体育联合会(loc){
位置:儿童推(d);
}否则{
r、 推(d);
}
映射[项目[id]]=d;
返回[r,map];
},
[[], {}]
);
返回结果;
}
//log(JSON.stringify(tree(source,“Id”,“Parent”),null,4);
document.querySelector(“pre”).innerHTML=JSON.stringify(tree(source,“Id”,“Parent”),null,4)
。作为控制台{
最小高度:100%!重要;
}
.作为控制台行{
颜色:蓝色!重要;
}
.code{

<代码> <代码>很棒,如果它回答了你的问题,你可以考虑接受它。太棒了,如果它回答了你的问题,你可以考虑接受它。