簡體   English   中英

基於特定鍵遞歸排序對象數組:Javascript

[英]Sort array of objects based on a particular key recursively: 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"
      }
    ]
  }
];

Output

 [
  {
    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對對象進行排序。 孩子們可以 go 最多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); 

您可以采用遞歸方法並迭代給定數組及其子屬性。

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

首先:您正在嘗試像數字一樣對字符串進行排序。 這就是為什么它不起作用。 b.label - a.label改為b.label > a.label

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

如果您需要更高級的排序可能性:使用localeCompare方法來比較字符串。

但通常修改現有數組是不好的方法。

更好的解決方案是創建一個遞歸排序 function 並使用它來創建新的排序數組:

function sortArray(arr, key) {
  return arr
    .map(item => ({
      ...item,
      children: sortArray(item.children || [], key)
    }))
    .sort((a, b) => b[key] > a[key]);
}

const sortedArray = sortArray(test, "label");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM