Javascript 使用lodash按父id对平面列表排序

Javascript 使用lodash按父id对平面列表排序,javascript,lodash,Javascript,Lodash,我有一个JSON对象列表,其中包含id、名称和对父id的引用: const myList = [ { id: 1, name: "name1", parentId: null }, { id: 5, name: "name5", parentId: 32 }, { id: 32, name: "name32", p

我有一个JSON对象列表,其中包含id、名称和对父id的引用:

const myList = [
    {
        id: 1,
        name: "name1",
        parentId: null
    },
    {
        id: 5,
        name: "name5",
        parentId: 32
    },
    {
        id: 32,
        name: "name32",
        parentId: 48
    },
    {
        id: 48,
        name: "name48",
        parentId: 1
    }
]
[
    {
        id: 1,
        name: "name1",
        parentId: null
    },
    {
        id: 48,
        name: "name48",
        parentId: 1
    },
    {
        id: 32,
        name: "name32",
        parentId: 48
    },
    {
        id: 5,
        name: "name5",
        parentId: 32
    }
]
我想根据父id对该列表进行分层排序:

const myList = [
    {
        id: 1,
        name: "name1",
        parentId: null
    },
    {
        id: 5,
        name: "name5",
        parentId: 32
    },
    {
        id: 32,
        name: "name32",
        parentId: 48
    },
    {
        id: 48,
        name: "name48",
        parentId: 1
    }
]
[
    {
        id: 1,
        name: "name1",
        parentId: null
    },
    {
        id: 48,
        name: "name48",
        parentId: 1
    },
    {
        id: 32,
        name: "name32",
        parentId: 48
    },
    {
        id: 5,
        name: "name5",
        parentId: 32
    }
]
我是Javascript编程和lodash方面的新手,我想知道是否有一种简单的方法可以用lodash对列表进行排序

先谢谢你。
Benj

你可以使用lodash的方法
sortBy

var sorted = _.sortBy(myList, "parentId");

console.log(sorted); 
/* OUTPUT
[
    {
        id: 1,
        name: "name1",
        parentId: null
    },
    {
        id: 48,
        name: "name48",
        parentId: 1
    },
    {
        id: 5,
        name: "name5",
        parentId: 32
    },
    {
        id: 32,
        name: "name32",
        parentId: 48
    }
] 
*/

使用香草js方法:

const myList=[
{
id:1,
名称:“名称1”,
parentId:null
},
{
id:5,
姓名:“姓名5”,
父ID:32
},
{
id:32,
姓名:“姓名32”,
家长编号:48
},
{
id:48,
姓名:“姓名48”,
父ID:1
}
];
var arr=myList.sort(函数(a,b){
返回a.parentId-b.parentId
});

console.log(arr)
我找到了一个使用lodash的解决方案。 我不确定这是最好的,但它很管用

var parentId = null;
var sortedList = [];
var byParentsIdsList = _.groupBy(myList, "parentId"); // Create a new array with objects indexed by parentId

while (byParentsIdsList[parentId]) {
    sortedList.push(byParentsIdsList[parentId][0]);
    parentId = byParentsIdsList[parentId][0].id;
}

我尝试了此方法,但输出不正确:
1,48,5,32
正确的输出是:
1,48,32,5
您的示例结果根本没有排序。。id:1,48,32,5 name:name1,name48,name32,name5 parentId:null,1,48,32是的。我希望列表中的对象根据对父ID的引用进行排序。。“name48”是第二个,因为它的父id是1,“name32”是第三个,因为它的父id是48…不,它不是。按parentId对asc排序的项目的正确顺序为:null、1、32、48。在您的示例中,它是:null、1、48、32(未正确排序),我从未告诉过它必须按parentId ASC排序。这是一个链表。我需要列表中的下一个元素是上一个元素的子元素,通过关系nextElement.parentId=previousElement.id。我找到了解决办法。谢谢。你在问题中从来没有提到过,所以任务不清楚。