假设下面的对象数组按 code
属性以 ascii 顺序排序:
var codes = [
{ code: '01' },
{ code: '0101' },
{ code: '0102' },
{ code: '010201' },
{ code: '0103' },
{ code: '02' },
{ code: '0201' },
{ code: '0202' },
];
我怎样才能把它转换成这样的嵌套数组:
var nestedCodes = [
{
code: '01',
children: [
{ code: '0101' },
{
code: '0102',
children: [
{ code: '010201' }
]
},
{ code: '0103' }
]
},
{
code: '02',
children: [
{ code: '0201' },
{ code: '0202' }
]
}
];
代码的结构就像连接多个0N
,N
可以是1到9之间的数字。注意代码来自服务器,会有一些额外的属性在 code
旁边,如 title
但在这个问题中并不重要。
这里的主要思想是为 jsTree 制作一个合适的格式.
最佳答案
您可以使用递归解决方案来做到这一点。这个想法是维护路径
(使用正则表达式通过String.prototype.match
作为数组获得)和父级
,您要在其下插入代码
用于每个递归调用。
parent
跟踪您要在“当前”递归调用中选择的节点,path
有助于构建parent
当你继续深入时:
function insert(d, path, parent, arr) {
if (path.length === 0) {
arr.push(Object.assign({}, d));
return;
}
var target = arr.find(e => e.code === parent);
target.children = target.children || [];
insert(d, path.slice(1), parent + path[0], target.children);
}
var codes = [
{ code: '01' },
{ code: '0101' },
{ code: '0102' },
{ code: '010201' },
{ code: '0103' },
{ code: '02' },
{ code: '0201' },
{ code: '0202' },
];
var res = codes.reduce((a, c) => {
var p = c.code.match(/(0[1-9])/g);
insert(c, p.slice(1), p[0], a);
return a;
}, []);
console.log(res);
当然,假设是当一个 code
被插入时,它的父级已经被插入了。
关于javascript - 将按 ASCII 顺序排序的一维数组转换为 Javascript 中的嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53493545/