Javascript 嵌套数组到对象的转换

Javascript nested array to object conversion

我有一个对象数组,格式如下。它基本上是一个嵌套的对象数组。我尝试使用递归函数来实现,但是我未能组织嵌套对象。

[
  {
    "id": "31a3sd2f1a3ds21f",
    "name": "Energy device",
    "child": [
      {
        "id": "65sa4d65a4sdf654adsf",
        "name": "Device 2",
        "child": [
          {
            "id": "65a4d65ad4s54adsf",
            "name": "Device 3",
            "child": []
          }
        ]
      }
    ]
  },
  {
    "id": "6as54d54as5f",
    "name": "Energy device 2",
    "child": [
      {
        "id": "9a8s7df98a78sdf",
        "name": "Device 4",
        "child": [
          {
            "id": "65a4d65ad4s54adsf",
            "name": "Device 5",
            "child": []
          }
        ]
      },
      {
        "id": "65asd54as5f4",
        "name": "Device 5-1",
        "child": []
      }
    ]
  }
]

我想把它转换成下面的格式。

{
  "31a3sd2f1a3ds21f": {
    "65sa4d65a4sdf654adsf": {
      "65a4d65ad4s54adsf": ""
    }
  },
  "6as54d54as5f": {
    "9a8s7df98a78sdf": {
      "65a4d65ad4s54adsf": ""
    },
    "65asd54as5f4": ""
  }
}

有没有人可以帮助我?

您可以将数组中的每个 object 映射到形状为 [key, value] 的新数组。对于每个 object,您可以在回调参数 ({id, child}) => ...) 中使用解构赋值提取 id 和 child 属性。然后,您可以 return 一个 object 的数组,代表您的新 object 建筑物的条目。键是当前 object 的 id,值是基于可以通过递归调用构建的 child 数组的新 object,或者如果您当前的 object 没有任何 children,则为空字符串。这允许您在构建 object 时将嵌套添加到它们。最后,您可以将 arr 的映射版本包装到对 Object.fromEntries() 的调用中,这样您就可以将 [key, value] 对条目的数组转换为 object:

const arr = [ { "id": "31a3sd2f1a3ds21f", "name": "Energy device", "child": [ { "id": "65sa4d65a4sdf654adsf", "name": "Device 2", "child": [ { "id": "65a4d65ad4s54adsf", "name": "Device 3", "child": [] } ] } ] }, { "id": "6as54d54as5f", "name": "Energy device 2", "child": [ { "id": "9a8s7df98a78sdf", "name": "Device 4", "child": [ { "id": "65a4d65ad4s54adsf", "name": "Device 5", "child": [] } ] }, { "id": "65asd54as5f4", "name": "Device 5-1", "child": [] } ] } ];

const mapToId = (arr) => Object.fromEntries(arr.map(({id, child}) => [
  id, child.length ? mapToId(child) : ""
]));

const res = mapToId(arr);
console.log(res);

我不知道为什么你希望最后的 child 是一个空字符串而不是一个空的 object,但这里是:

function arrayToObject(array) {
    // Create empty object if array has cildren, else create an empty string
    const obj = array.length > 0 ? {} : '';

    // Recursively add children to object
    array.forEach((item) => {
        obj[item.id] = arrayToObject(item.child);
    });

    return obj;
}