如何将这个数组的数组转换为嵌套的对象数组?



我有这个嵌套数组格式的数据,我正在从csv中读取。

const data = [[P1,A1,W1],[P1,A1,W2],[P1,A1,W3],
[P1,A2,W4],[P1,A2,W5],[P1,A2,W6],
[P2,A3,W7],[P2,A3,W8],[P2,A3,W9]]

我正在尝试将此数据转换为此格式-


[
{
text:P1,
sub_list:[
{
text:A1,
sub_list:[
{
text:W1,
sub_list:[]
},
{
text:W2,
sub_list:[]
},
{
text:W3,
sub_list:[]
}
]
},
{
text:A2,
sub_list:[
{
text:W4,
sub_list:[]
},
{
text:W5,
sub_list:[]
},
{
text:W6,
sub_list:[]
}
]
}
]
},
{
text:P2,
sub_list:[
{
text:A3,
sub_list:[
{
text:W7,
sub_list:[]
},
{
text:W8,
sub_list:[]
},
{
text:W9,
sub_list:[]
}
]
}
]
}
]
我想不出一个可行的解决办法。我想用递归的方式来做。没有。嵌套数组中项的值可以大于3。

可能的解决方案是什么?

const data = [
['P1', 'A1', 'W1'],
['P1', 'A1', 'W2'],
['P1', 'A1', 'W3'],
['P1', 'A2', 'W4'],
['P1', 'A2', 'W5'],
['P1', 'A2', 'W6'],
['P2', 'A3', 'W7'],
['P2', 'A3', 'W8'],
['P2', 'A3', 'W9']
]
const obj = []
for (const item of data) {
let current = obj
for (const sub of item) {
const subItem = current.find(i => i.text === sub)
if (subItem) {
current = subItem.sub_list
} else {
const newItem = {
sub_list: [],
text: sub
}
current.push(newItem)
current = newItem.sub_list
}
}
}
console.log(obj)

您可以维护一个映射,以便从(部分)路径知道哪个是目标层次结构中对应的对象(如果它已经存在)。当您遵循路径时,您可以通过该映射查找父节点,并将子节点插入到其"子列表"中。

下面是一个函数:

function hierarchy(data) {
const root = [];
const map = { "": root };
for (const path of data) {
let key = "";
for (const text of path) {
let parent = key;
key += "n" + text;
if (!(key in map)) {
map[parent].push({text, sublist: map[key] = []});
}
}
}
return root;
}
const data = [['P1', 'A1', 'W1'],['P1', 'A1', 'W2'],['P1', 'A1', 'W3'],['P1', 'A2', 'W4'],['P1', 'A2', 'W5'],['P1', 'A2', 'W6'],['P2', 'A3', 'W7'],['P2', 'A3', 'W8'],['P2', 'A3', 'W9']];
const arr = hierarchy(data);
console.log(arr);

最新更新