首页 > 解决方案 > 对象数组转换为嵌套数组

问题描述


let input = [
  {
    'id': "1",
    'parent_aid': "1",
  },
  {
    'id': "2",
    'parent_aid': "1",
  },
  {
    'id': "3",
    'parent_aid': "2",
  },
  {
    'id': "4",
    'parent_aid': "3",
  },
  {
    'id': "5",
    'parent_aid': "4",
  },
  {
    'id': "6",
    'parent_aid': "5",
  },
  {
    'id': "8",
    'parent_aid': "7",
  },
   {
    'id': "7",
    'parent_aid': "6",
  },
  
  {
    'id': "9",
    'parent_aid': "8",
  },
  {
    'id': "10",
    'parent_aid': "9",
  },
  {
    'id': "11",
    'parent_aid': "10",
  },
  {
    'id': "12",
    'parent_aid': "11",
  },
];

// output result should be 
const result = {
  "1": {
    "value": {
      "id": "1",
      "parent_aid": "1"
    },
    "2": {
      "value": {
        "id": "2",
        "parent_aid": "1"
      },
      "3": {
        "value": {
          "id": "3",
          "parent_aid": "2"
        },
        "4": {
          "value": {
            "id": "4",
            "parent_aid": "3"
          },
          "5": {
            "value": {
              "id": "5",
              "parent_aid": "4"
            },
            "6": {
              "value": {
                "id": "6",
                "parent_aid": "5"
              },
              "7": {
                "id": "7",
                "parent_aid": "6"
              }
            }
          }
        }
      }
    }
  }
}


let output = {};
let getChildObject = (arr, parentID, obj) => {
  if(!parentID) return;
  return arr.find(val => (val.parent_aid === parentID));

}



const makeNestedObjWithArrayItemsAsKeys = (arr) => {
  let rootIndex = arr.findIndex(val => (val.aid == val.parent_aid));
  let root = arr[rootIndex];
  arr.slice(rootIndex)
  output[root.aid] = { value: root }
  let prev= root.aid;
  for(let i = 0; i < input.length - 1; i++) {
    const childObj = getChildObject(arr, prev);
    if(childObj) {
      const value = output[prev];
      let key = childObj['id']
      console.log("ccc",key)
      output[prev][key] = { value: childObj}
      prev = childObj['id'];
    }
  };

  return output
 
};

 makeNestedObjWithArrayItemsAsKeys(input);

标签: javascriptarrays

解决方案


我做了一些评论,因为我认为您的示例定义不正确(输出中缺少节点,并且叶子没有value属性)。

您可以使用 a来存储由它们的值map作为键的最终节点。id然后,在再次迭代数据时,您可以建立这些对象之间的关系并确定根。

这是代码:

let input = [{'id': "1",'parent_aid': "1",},{'id': "2",'parent_aid': "1",},{'id': "3",'parent_aid': "2",},{'id': "4",'parent_aid': "3",},{'id': "5",'parent_aid': "4",},{'id': "6",'parent_aid': "5",},{'id': "7",'parent_aid': "6",},];

let map = new Map(input.map(value => [value.id, { value }]));
let root;
for (let {id, parent_aid} of input) {
    if (id !== parent_aid) map.get(parent_aid)[id] = map.get(id);
    else root = { [id]: map.get(id) };
}
console.log(root);

请注意,在 JavaScript 对象中,表示数字的属性(最多限制)在其他属性之前被迭代/列出,因此您会看到上面的代码片段value在数字之后输出属性。


推荐阅读