根据特定键递归地对 objects 的数组进行排序:Javascript
Sort array of objects based on a particular key recursively: Javascript
我有一个 objects 数组,格式如下:
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
对 objects 进行排序。 children 可以上升到 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 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");
我有一个 objects 数组,格式如下:
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
对 objects 进行排序。 children 可以上升到 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 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");