[英]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.