使用lodash按父ID对平面列表进行排序

时间:2015-12-04 10:52:53

标签: javascript lodash

我有一个JSON的对象列表,其中包含id,name和对父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:

[
    {
        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

3 个答案:

答案 0 :(得分:2)

我找到了一个用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 :(得分:0)

您可以使用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
    }
] 
*/

https://jsfiddle.net/L88t09ne/

答案 2 :(得分:0)

使用vanilla js [].sort()方法:

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
    }
];
var arr = myList.sort(function(a,b){
  return a.parentId -b.parentId
});
console.log(arr)