获取对象数组并将上述 JSON 转换为 JavaScript 中的树结构

javascriptweb developmentfront end technologyobject oriented programming

假设我们有一个像这样的对象数组 −

const arr = [
   {
      "parentIndex": '0' ,
      "childIndex": '3' ,
      "parent": "ROOT",
      "child": "root3"
   },
   {
      "parentIndex": '3' ,
      "childIndex": '2' ,
      "parent": "root3" ,
      "child": "root2"
   },
   {
      "parentIndex": '3' ,
      "childIndex": '1' ,
      "parent": "root3" ,
      "child": "root1"
   }
];

我们需要编写一个 JavaScript 函数,该函数接受一个这样的对象数组。然后,该函数应使用递归并将上述 JSON 转换为 Tree−结构。

Tree−结构如下所示 −

nodeStructure: {
   text: { name: "root3" },
   children: [
      {
         text: { name: "root2" }
      },
      {
         text: { name: "root1" }
      }
   ]
}
};

示例

其代码为 −

const arr = [
   {
      "parentIndex": '0' ,
      "childIndex": '3' ,
      "parent": "ROOT",
      "child": "root3"
   },
   {
      "parentIndex": '3' ,
      "childIndex": '2' ,
      "parent": "root3" ,
      "child": "root2"
   },
   {
      "parentIndex": '3' ,
      "childIndex": '1' ,
      "parent": "root3" ,
      "child": "root1"
   }
];
const partial = (arr = [], condition) => {
   const result = [];
   for (let i = 0; i < arr.length; i++) {
      if(condition(arr[i])){
         result.push(arr[i]);
      }
   }
   return result;
}
const findNodes = (parentKey,items) => {
   let subItems = partial(items, n => n.parent === parentKey);
   const result = [];
   for (let i = 0; i < subItems.length; i++) {
      let subItem = subItems[i];
      let resultItem = {
         text: {name:subItem.child}
      };
      let kids = findNodes(subItem.child , items);
      if(kids.length){
         resultItem.children = kids;
      }
      result.push(resultItem);
   }
   return result;
}
console.log(JSON.stringify(findNodes('ROOT', arr), undefined, 4));

输出

控制台中的输出将是 −

[
   {
      "text": {
         "name": "root3"
      },
      "children": [
         {
            "text": {
               "name": "root2"
            }
         },
         {
            "text": {
               "name": "root1"
            }
         }
      ]
   }
]

相关文章