1 回答
TA贡献1834条经验 获得超8个赞
Array#filter我们可以首先使用 过滤掉没有父级的项目,因为这些是我们需要保留在最终数组中的项目。
然后使用它们将它们映射到其子项并在每个项目中Array#find添加一个属性:children
const mapToChild = (data) => {
return data
.filter(i => !i.parent)
.map(d => {
let children;
if(!d.parent){
children = data.filter(i => i.parent === d.id);
}
return children && children.length ? {...d, children} : d;
});
}
const data = [
{
id: 1,
text : "Hello world",
parent : null
},
{
id: 2,
text : "Hello world",
parent : null
},
{
id: 3,
text : "Hello world",
parent : 2
},
{
id: 4,
text : "Hello world",
parent : 1
},
{
id: 5,
text : "Hello world",
parent : 1
},
{
id: 6,
text : "Hello world",
parent : null
},
{
id: 7,
text : "Hello world",
parent : null
}
];
console.log(mapToChild(data));
编辑以处理嵌套子项:
Array#reduce当我们必须照顾嵌套的孩子时,我们可以使用:
const mapToChild = (data) => {
return data.reduce((r, o) => {
const children = data.filter(i => i.parent == o.id);
if(children && children.length) {
o.children = children;
}
!o.parent && r.push(o);
return r;
}, []);
}
const data = [
{
id: 2,
text : "Hello world",
parent : null
},
{
id: 3,
text : "Hello world",
parent : 2
},
{
id: 4,
text : "Hello world",
parent : 3
}
];
console.log(mapToChild(data));
添加回答
举报