我得到一个对象数组。为了便于解释,我减少了属性,只留下了相关的属性。 我需要对这些对象进行排序,并创建一个新数组。 原始阵列是未分类的。
进入数组的对象可以包含任意数量的子对象。孩子们也可以有自己的孩子。但最后它们都是主要对象的子节点(parent_id:null)。 //未排序
let data = [
{
id: 1,
name:'ParentAlpha',
parent_id: null
},
{
id: 2,
name:'ParentBeta',
parent_id: null
},
{
id: 100,
name:'ChildOneAlpha',
parent_id: 1
},
{
id: 101,
name:'ChildTwoAlpha',
parent_id: 1
},
{
id: 102,
name:'SubChildOneAlpha',
parent_id: 100
},
{
id: 103,
name:'SubChildTwoAlpha',
parent_id: 100
},
{
id: 200,
name:'ChildOneBeta',
parent_id: 2
},
{
id: 201,
name:'ChildTwoBeta',
parent_id: 2
}]
我想要实现的是(相同的结构,但我已经省略了JSON结构)。
[{ParentAlpha...},
{ChildOneAlpha...},
{SubChildOneAlpha...},
{SubChildTwoAlpha...},
{ChildTwoAlpha...},
{ParentBeta...},
{ChildOneBeta...},
{ChildTwoBeta...}]
我做了一个工作code,但我认为它可以做得更好,我想了解更多。但是我看代码,我不知道如何改进它。如果有人可以指出一些指南,我将不胜感激。
我的工作代码:
let processedProducts = [],
processedid = [],
rearangedProducts = [];
let subParentProducts = data.slice();
let masterParentProducts = data.filter((product)=>{
return product.parent_id === null
});
masterParentProducts.forEach((productParent)=>{
if(processedid.indexOf(productParent.id) === -1){
processedid.push(productParent.id);
processedProducts.push(productParent);
}
data.forEach((product, index)=>{
if (product.parent_id === productParent.id){
processedProducts.push(product);
subParentProducts[index] = null;
}
if (product.id === productParent.id) {
subParentProducts[index] = null
}
})
});
subParentProducts = subParentProducts.filter(function(n){ return n !== null });
processedProducts.forEach((prod)=>{
rearangedProducts.push(prod);
let res = subParentProducts.filter((o)=> {
return o.parent_id === prod.id;
});
if (res.length > 0){
rearangedProducts.push(res[0]);
}
});
console.log(rearangedProducts)
答案 0 :(得分:2)
您可以使用递归创建函数来构建新的排序数组。
let data = [{"id":1,"name":"ParentAlpha","parent_id":null},{"id":2,"name":"ParentBeta","parent_id":null},{"id":100,"name":"ChildOneAlpha","parent_id":1},{"id":101,"name":"ChildTwoAlpha","parent_id":1},{"id":102,"name":"SubChildOneAlpha","parent_id":100},{"id":103,"name":"SubChildTwoAlpha","parent_id":100},{"id":200,"name":"ChildOneBeta","parent_id":2},{"id":201,"name":"ChildTwoBeta","parent_id":2}]
function sortArray(data, parent) {
return data.reduce(function(r, e) {
if (e.parent_id == parent) {
r.push(e)
var children = sortArray(data, e.id)
if (children.length) r = r.concat(children)
}
return r;
}, [])
}
console.log(sortArray(data, null))