递归地遍历对象数组以创建父子关系

时间:2018-08-21 04:39:28

标签: javascript

我有一个对象数组,如下所示:

arr =[{
    refno: "1",
    name : "section-1"
 },{
    refno: "1.1",
    name : "section-1.1"
 },{
    refno: "1.1.1",
    name : "section-1.1.1"
 },{
    refno: "1.1.2",
    name : "section-1.1.2"
 },{
    refno: "1.1.3",
    name : "section-1.1.3"
 },{
    refno: "1.2",
    name : "section-1.2"
 },{
    refno: "1.2.1",
    name : "section-1.2.1"
 }]

我需要像这样转换此数组:

[{
    "1": {
        name: "Section-1",
        children: [{
            "1.1": {
                name: "Section-1.1",
                children: [{
                    "1.1.1": {
                        name: "Section-1.1.1",
                        children: []
                    },
                    "1.1.2": {
                        name: "Section-1.1.2",
                        children: []
                    },
                     "1.1.2": {
                        name: "Section-1.1.3",
                        children: []
                    }
                }]
            },
            "1.2": {
                name: "Section-1.2",
                children: [{
                    name: "Section-1.2",
                    children: {
                        "1.2.1": {
                            name: "Section-1.2.1",
                            children: []
                        }
                    }
                }]
            }]
        }
    }
}]

1 个答案:

答案 0 :(得分:1)

我为此而努力。输出结果可能与您的略有不同。请检查代码和输出。 Gist

var arr =[{
    refno: "1",
    name : "section-1"
 },{
    refno: "1.1",
    name : "section-1.1"
 },{
    refno: "1.1.1",
    name : "section-1.1.1"
 },{
    refno: "1.1.2",
    name : "section-1.1.2"
 },{
    refno: "1.1.3",
    name : "section-1.1.3"
 },{
    refno: "1.2",
    name : "section-1.2"
 },{
    refno: "1.2.1",
    name : "section-1.2.1"
 }];
 
function hasKey2(arr, key) {
  let index = -1;
  for (let x of arr) {
    if (x[key] != undefined) {
      index = x;
      break;
    }
  }
  return index;
}

function main(arr) {
  let output = [];
  for (let element of arr) {
    const refno = element.refno;
    const refArr = element.refno.split(".");
    let tempArr = output;
    let markSection = "section-";
    for (let ref of refArr) {
      markSection = markSection + ref;
      let ind = hasKey2(tempArr, ref);
      if (ind != -1) {
        tempArr = ind[ref].children;
      } else {
        tempArr.push({
          [ref]: {
            name: markSection,
            children: []
          }
        });
        tempArr = tempArr[tempArr.length - 1][ref].children;
      }
      markSection = markSection + ".";
    }
  }
  console.log("Output ", output);
  return output;
}

main(arr);

输出如下。

[{"1":{"name":"section-1","children":[{"1":{"name":"section-1.1","children":[{"1":{"name":"section-1.1.1","children":[]}},{"2":{"name":"section-1.1.2","children":[]}},{"3":{"name":"section-1.1.3","children":[]}}]}},{"2":{"name":"section-1.2","children":[{"1":{"name":"section-1.2.1","children":[]}}]}}]}}]
相关问题