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;
}
我有一个对象数组,格式如下。它基本上是一个嵌套的对象数组。我尝试使用递归函数来实现,但是我未能组织嵌套对象。
[
{
"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;
}