Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将平面多分支数据转换为分层JSON?_Javascript_Node.js_Algorithm_Tree - Fatal编程技术网

Javascript 如何将平面多分支数据转换为分层JSON?

Javascript 如何将平面多分支数据转换为分层JSON?,javascript,node.js,algorithm,tree,Javascript,Node.js,Algorithm,Tree,上面是我从数据库中得到的数据。每个人都有一个id和一个pid,pid指向该人更高级别的id。如果一个人具有最高级别,则id等于pid 我想将原始数据转换为分层JSON,如下所示: [ { "id": "a", "pid": "a", "name": "AA", }, { "id": "b", "pid": "a", "name": "BB", }, { "id": "c", "pid": "a", "na

上面是我从数据库中得到的数据。每个人都有一个
id
和一个
pid
pid
指向该人更高级别的
id
。如果一个人具有最高级别,则
id
等于
pid

我想将原始数据转换为分层JSON,如下所示:

[
  {
    "id": "a",
    "pid": "a",
    "name": "AA",
  },
  {
    "id": "b",
    "pid": "a",
    "name": "BB",
  },
  {
    "id": "c",
    "pid": "a",
    "name": "CC",
  },
  {
    "id": "x",
    "pid": "b",
    "name": "XX",
  }
]

我正在使用Node.js。

我建议您创建一个树,并将
id==pid
作为树的根,该树适用于未排序的数据

工作原理:

基本上,对于数组中的每个对象,它将用于构建新对象的
id
作为新对象的
parentid

例如:

[
  {
    "id": "a",
    "name": "AA",
    "child": [
      {
        "id": "b",
        "name": "BB"
        "child": [
          {
            "id": "x",
            "name": "XX"
          }
        ]
      },
      {
        "id": "c",
        "name": "CC"
      }
    ]  
  }
]
它首先使用
id
生成此属性:

{ "id": 6, "pid": 4 }
"6": {
    "id": 6,
    "pid": 4
}
然后使用
pid

{ "id": 6, "pid": 4 }
"6": {
    "id": 6,
    "pid": 4
}
当所有对象都被类似地处理时,我们最终得到了一棵树

如果
id==pid
,则找到根节点。这是稍后返回的对象

var数据=[
{“id”:“f”,“pid”:“b”,“name”:“f”},
{“id”:“e”,“pid”:“c”,“name”:“e”},
{“id”:“d”,“pid”:“c”,“name”:“d”},
{“id”:“c”,“pid”:“b”,“name”:“c”},
{“id”:“a”,“pid”:“a”,“name”:“a”},
{“id”:“b”,“pid”:“a”,“name”:“b”}
],
树=函数(数据){
var r,o=Object.create(null);
data.forEach(函数(a){
a、 children=o[a.id]&&o[a.id];
o[a.id]=a;
如果(a.id==a.pid){
r=a;
}否则{
o[a.pid]=o[a.pid]|{};
o[a.pid]。children=o[a.pid]。children | |[];
o[a.pid].children.push(a);
}
});
返回r;
}(数据);

控制台日志(树)受尼娜回答的影响,这是我的决议,仅供记录在案

功能波纹(数据){
var root=“”;
返回数据。减少((t,o)=>{
o、 id==o.pid&(root=o.id);
t[o.id]?t[o.id].name=o.name
:t[o.id]={id:o.id,name:o.name};
t[o.pid]?o.pid!==o.id?t[o.pid]。children.push(t[o.id])
:t[o.pid]。children=t[o.pid]。children | |[]
:t[o.pid]={id:o.pid,子项:[t[o.id]]};
返回t;
},{}[根];
}
var data=[{“id”:“f”,“pid”:“b”,“name”:“f”},
{“id”:“e”,“pid”:“c”,“name”:“e”},
{“id”:“b”,“pid”:“a”,“name”:“b”},
{“id”:“d”,“pid”:“c”,“name”:“d”},
{“id”:“c”,“pid”:“b”,“name”:“c”},
{“id”:“a”,“pid”:“a”,“name”:“a”}
];

日志(波纹状(数据))
数据是按id排序的,还是随机排序的?@NinaScholz它是随机排序的,但id是唯一的。您如何知道树的根?请添加更多数据以供检查。@NinaScholz当
id
等于
pid
时,他是根。我更新了问题,谢谢@谢谢你!我现在知道怎么解决这种问题了!值得一提的是,这个出色的算法充分利用了JS中对象是引用类型的优点。这一事实简单地节省了大量的排序工作。@AlexeiLevenkov,引用是我的一部分,它不是从其他地方复制的。@NinaScholz好的,只是想检查编辑是否合理。(我不会对特定帖子的内容使用引用格式……但我认为没有任何强有力的指导来反对它)。(读取时标记为“不再需要”)