多维数组排序问题?

多维数组排序如何升序降序,假设多维数组的层级可能有无数层?

var arr=[
    {
    sortOder:6,
    children:[
      {sortOder:6},
      {sortOder:5}
    ]
    },
    {
        sortOder:8,
        children:[
            {sortOder:9},
            {sortOder:1}
        ]
    },
    {
        sortOder:9,
        children:[
            {sortOder:12},
            {sortOder:10}
        ]
  },
    {
        sortOder:10,
        children:[
            {sortOder:13},
            {sortOder:2}
        ]
    },
    {
        sortOder:20,
        children:[
            {sortOder:9},
            {sortOder:1}
        ]
    }
]
阅读 2k
3 个回答
  1. 递归遍历,参阅:使用递归遍历并转换树形数据(以 TypeScript 为例)
  2. 再多层也只能在本层排序
  3. 考虑同层节点权重是单节点值还是含所有子孙节点的统计值

本来不想写代码,但是看了楼上的代码之后(怎么会在排序比较函数里去递归?!),还是写个吧:

function sortTree(nodeList) {
    if (!Array.isArray(nodeList)) { return; }
    nodeList.forEach(({ children }) => sortTree(children));
    nodeList.sort((a, b) => a.sortOder - b.sortOder);
}

sortTree(arr);

console.dir(arr, { depth: null });

递归

function SortAll(arr){
  
  return arr.sort((a,b)=>{
    if(a.children){
      a.children=SortAll(a.children)
    }
    return a.sortOder-b.sortOder
  })
}
function sortDeep(arr) {
    return arr.sort((a,b) => {
        // sort会修改原数组,所以无需重写children
        a.children && !a._sort && sortDeep(a.children)
        b.children && !b._sort && sortDeep(b.children)
        // 设置标记以防止下一次a,b排序时重复排序
        a._sort = true; 
        b._sort = true;
        return a.sortOder-b.sortOder;
    })
}
推荐问题
宣传栏