【问题标题】:Cyclic Tree with new ParentId and ChildId具有新 ParentId 和 ChildId 的循环树
【发布时间】:2019-11-08 00:15:45
【问题描述】:

我有一个具有多级嵌套的层次结构树 JSON。当我试图遍历 JSON 以在 UI 中显示树结构时。我以循环冗余结束,因为父 ID 在不同级别是相同的。我需要为 parentID 和 ID 添加唯一标识符,因此在递归调用中它不会以无限循环结束。

示例 JSON:

[
  {
    "id": "12",
    "text": "Man"
  },
  {
    "id": "6",
    "parentId": "12",
    "text": "Boy"
  },
  {
    "id": "9",
    "parentId": "6",
    "text": "Boy-Boy"
  },
  {
    "id": "13",
    "parentId": "9",
    "text": "Boy-Boy-Boy"
  },
  {
    "id": "7",
    "parentId": "12",
    "text": "Other"
  },
  {
    "id": "6",
    "parentId": "7",
    "text": "Boy"
  },
  {
    "id": "9",
    "parentId": "6",
    "text": "Boy-Boy"
  },
  {
    "id": "13",
    "parentId": "9",
    "text": "Boy-Boy-Boy"
  }

我已尝试为每个级别添加深度,但无法保持 ParentId 和 Id 关系。

var depthArray = []

function addDepth(arr, depth = 0) {
  arr.forEach(obj => {


  obj.id =  obj.id + '-' + depth;
  if(obj.children !== undefined) {
  addDepth(obj.children, depth + 1)
}})
return arr;
}

[
  {
    "id": "12",
    "text": "Man"
  },
  {
    "id": "6",
    "parentId": "12",
    "text": "Boy"
  },
  {
    "id": "9",
    "parentId": "6",
    "text": "Boy-Boy"
  },
  {
    "id": "13",
    "parentId": "9",
    "text": "Boy-Boy-Boy"
  },
  {
    "id": "7",
    "parentId": "12",
    "text": "Other"
  },
  {
    "id": "6-1",
    "parentId": "7",
    "text": "Boy"
  },
  {
    "id": "9-1",
    "parentId": "6-1",
    "text": "Boy-Boy"
  },
  {
    "id": "13-1",
    "parentId": "9-1",
    "text": "Boy-Boy-Boy"
  }
]

【问题讨论】:

  • 为什么会有重复的节点?同一个节点有可能有两个父母吗?最后,你想达到什么目的?目前还不是很清楚问题是什么。
  • @Maaz Syed Adeeb,层次结构树具有循环和相互关系,因此给出了重复的节点。是的,相同的节点可以有两个父节点,因为它是循环的。我正在尝试生成树结构,如果存在循环关系,我想为重复节点提供一个唯一的 ID,以便整个树结构具有唯一的节点 ID。希望这会有所帮助
  • ID 9 / parentId 6 的 Btw 副本非常奇怪 - 可能是一些拼写错误?

标签: javascript arrays json cyclic-dependency


【解决方案1】:

你的递归不起作用,那怎么办? 但不确定如何重命名 ID:

'use strict';
function addDepth(arr, id, depth) {
  if(depth === undefined) depth = 0;
  if(id !== undefined)
    arr.forEach(obj => {

        if(id == obj.parentId) {
        if(depth) obj.parentId += '-' + depth;
        addDepth(arr, obj.id, depth + 1)
      }
    })
  else arr.forEach(obj => { addDepth(arr, obj.id, depth); });
  return arr;
}

console.log(addDepth(
[
  {
    "id": "12",
    "text": "Man"
  },
  {
    "id": "6",
    "parentId": "12",
    "text": "Boy"
  },
  {
    "id": "9",
    "parentId": "6",
    "text": "Boy-Boy"
  },
  {
    "id": "13",
    "parentId": "9",
    "text": "Boy-Boy-Boy"
  },
  {
    "id": "7",
    "parentId": "12",
    "text": "Other"
  },
  {
    "id": "6",
    "parentId": "7",
    "text": "Boy"
  },
  {
    "id": "9",
    "parentId": "6",
    "text": "Boy-Boy"
  },
  {
    "id": "13",
    "parentId": "9",
    "text": "Boy-Boy-Boy"
  }
]
));

很难猜测结构可能是什么样子,但手动生成了假定的输出,然后是类似的代码 - 仅查找(不确定如何区分具有 parentId 差异的相同记录):

12          Man
12 6        Man Boy
12 6 9      Man Boy Boy-Boy
12 6 9 13   Man Boy Boy-Boy Boy-Boy-Boy
12 7        Man Other
12 7        Man Other Boy
12 7 6 9    Man Other Boy Boy-Boy
12 7 6 9 13 Man Other Boy Boy-Boy Boy-Boy-Boy

var data = GetData();
var arr = [data[0].text], parent;
for(var i=0;i<data.length;i++) {
    if(parent = data[i].parentId) {
        arr.push(data[i].text); // we have parentId, so iterate back
        for(var j=i;j >= 0;j--) {
            if(data[j].id == parent) {
                arr.push(data[j].text); // & colect text properties
                if(data[j].parentId) {
                    parent = data[j].parentId;
                    j = i;
                }
            }
        }
    }
    console.log(arr.reverse().join(" -> "));
    arr = [];
}

function GetData() { return [
    {
      "id": "12",
      "text": "Man"
    },
    {
      "id": "6",
      "parentId": "12",
      "text": "Boy"
    },
    {
      "id": "9",
      "parentId": "6",
      "text": "Boy-Boy"
    },
    {
      "id": "13",
      "parentId": "9",
      "text": "Boy-Boy-Boy"
    },
    {
      "id": "7",
      "parentId": "12",
      "text": "Other"
    },
    {
      "id": "6",
      "parentId": "7",
      "text": "Boy"
    },
    {
      "id": "9",
      "parentId": "6",
      "text": "Boy-Boy"
    },
    {
      "id": "13",
      "parentId": "9",
      "text": "Boy-Boy-Boy"
    }
];
}

【讨论】:

  • 我的要求是我有一个层次结构树,它具有循环和相互关系,因此给出了重复的节点,相同的节点可以有两个父节点,因为它是循环的。我正在尝试生成树结构,如果存在循环关系,我想给重复节点一个唯一的 id,以便整个树结构具有唯一的节点 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多