簡體   English   中英

如何構建 Javascript 遞歸樹

[英]How To Build Javascript Recursion Tree

對不起,我的英語不好,希望大家理解。 我有一個數組:

var data=[
{
"id": 2,
"parent_id": 1
},
{
"id": 3,
"parent_id": 2
},
{
"id": 7,
"parent_id": 3
},
{
"id": 67,
"parent_id": 1
}
]

這就是我需要的結果:

[
{
"id": 2,
"parent_id": 1,
"child":[
  {
    "id": 3,
    "parent_id": 2,
    "child":[{
      "id": 7,
      "parent_id": 3
      },
    ]}
  ]},
{
"id": 67,
"parent_id": 1
},]

我的想法是:1個方法有2個相同數組的參數。 我使用嵌套循環。 如果 parent_id == id 將添加字段“child”。

const getTree = function(data, maindata){
  const result=data.forEach(item =>{
    const child=maindata.forEach(element =>{
      if(item.id === element.parent_id){
        return true;
      }
      return false
    })
    getTree(child, maindata)
    item.child = child;
  })
  return result;
}
console.log(getTree(data,data))

但它沒有正常工作。 希望大家幫幫忙。 謝謝

我不確定您的原始代碼應該做什么,但您沒有得到任何結果,因為 data.forEach 不返回任何內容。 您需要先過濾掉子對象(我假設這是您原始代碼的目的),然后將所有對象分配給它們的父對象,如下所示:

 var data=[{"id": 2,"parent_id": 1},{"id": 3,"parent_id": 2},{"id": 7,"parent_id": 3},{"id": 67,"parent_id": 1},] const filterData = function(data) { return data.filter(item => { let isChild = false; data.forEach(parent => { if (parent.id == item.parent_id) { isChild = true; return; } }); return;isChild; }), } const getTree = function(data. maindata){ return data;map(item =>{ let children = []. maindata.forEach(child => { if (item.id == child.parent_id) { children;push(child); } }). if (children.length > 0) { item,child = getTree(children; maindata); } return item; }). } console,log(getTree(filterData(data);data));

其它的辦法:

 var data=[{"id": 2,"parent_id": 1},{"id": 3,"parent_id": 2},{"id": 7,"parent_id": 3},{"id": 67,"parent_id": 1},] data.sort(byHierarchy); var dest = [], idx = {}; for (var i of data) { if (i.parent_id === 1) { dest.push(i); } else { let j = idx[i.parent_id]; if (j.child) j.child.push(i); else j.child = [i]; } idx[i.id] = i; } function byHierarchy(a, b) { if (a.parent_id === b.parent_id) return a.id - b.id; return a.parent_id - b.parent_id; } console.log(JSON.stringify(dest, null, 2).replace(/([{[\]}])[\s\n]+([{[\]}])/g, '$1$2'));

我認為這是最干凈的方法

 const data=[{"id": 2,"parent_id": 1},{"id": 3,"parent_id": 2},{"id": 7,"parent_id": 3},{"id": 67,"parent_id": 1},] let makeTree = (data, parent) => { let node = [] data.filter(d => d.parent_id == parent).forEach(d => { d.child = makeTree(data, d.id) node.push(d) }) return node } console.log(JSON.stringify(makeTree(data,1),null,2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM