提问者:小点点

基于特定键递归排序对象数组:Javascript


我有一个对象数组,其格式如下:

var test = [
  {
    value: "Others",
    parentId: "",
    label: "Others",
    children: [
      {
        value: "user12",
        parentId: "Others",
        label: "bdefault51"
      },
      {
        value: "user11",
        parentId: "Others",
        label: "adefault50"
      }
    ]
  },
  {
    value: "Local",
    parentId: "",
    label: "local",
    children: [
      {
        value: "user56",
        parentId: "local",
        label: "bserver"
      },
      {
        value: "user78",
        parentId: "local",
        label: "aserver"
      }
    ]
  },
  {
    value: "Lab1",
    parentId: "",
    label: "lab1",
    children: [
      {
        value: "user157",
        parentId: "ent1",
        label: "enterprise45"
      },
      {
        value: "user139",
        parentId: "ent1",
        label: "enterprise37"
      },
      {
        value: "user136",
        parentId: "ent1",
        label: "enterprise56"
      }
    ]
  }
];

输出量

 [
  {
    value: "Lab1",
    parentId: "",
    label: "lab1",
    children: [
      {
        value: "user139",
        parentId: "ent1",
        label: "enterprise37"
      },
      {
        value: "user157",
        parentId: "ent1",
        label: "enterprise45"
      },
      {
        value: "user136",
        parentId: "ent1",
        label: "enterprise56"
      }
    ]
  },
  {
    value: "Local",
    parentId: "",
    label: "local",
    children: [
      {
        value: "user78",
        parentId: "local",
        label: "aserver"
      },
      {
        value: "user56",
        parentId: "local",
        label: "bserver"
      }
    ]
  },
  {
    value: "Others",
    parentId: "",
    label: "Others",
    children: [
      {
        value: "user11",
        parentId: "Others",
        label: "adefault50"
      },
      {
        value: "user12",
        parentId: "Others",
        label: "bdefault51"
      },   
    ]
  }
];

我需要根据属性label对对象进行排序。 子级可以上升到N级,也需要按label进行排序。

我试过的代码

for (var i = 0; i < test.length; i++) {
  test[i].children.sort((a, b) => {
    return b.label - a.label;
  });
}

//Tried with lodash also
let sorted = _.sortBy(test,"label");
let sorted1 = _.orderBy(test,"label","asc");
console.log(test); 

共1个答案

匿名用户

您可以采用递归方法,迭代给定数组及其子属性。

const
    sort = array => {
        array.sort((a, b) => a.label.localeCompare(b.label));
        array.forEach(({ children = [] }) => sort(children));
    };