用Javascript中的多个属性对对象数组进行排序
我整天都在阅读类似的帖子,但无法弄清楚如何按多个属性对我的javascript数组进行排序. 我的数组具有名称"和类型"属性. 现在按名称排序:
I've been reading similar posts all day but can't figure out how to sort my javascript array by multiple properties. My array has a 'name' and 'type' property. To sort by name I now use:
byNameDesc.sort(function (a, b) {
var x = a.name.toLowerCase();
var y = b.name.toLowerCase();
return y < x ? -1 : y > x ? 1 : 0;
});
效果很好.我想增强此功能.如果名称"为"foo",则应始终位于最上面.我也想按类型"排序. 因此,"foo"应始终放在最前面,然后按名称"和类型"排序.
Works great. I want to enhance this function. If 'name' is 'foo' it should always be on top. And I also want to sort by 'type'. So 'foo' should always be on top, next sort by 'name' and 'type'.
我尝试过:
byNameDefault.sort(function (a, b) {
if (a.name == 'foo') {
return -1;
}
var x = a.type.toLowerCase();
var y = b.type.toLowerCase();
return x < y ? -1 : x > y ? 1 : 0;
});
但这没用.
我不知道如何按名称"和类型"进行排序.
And I have no clue how to sort by 'name' AND 'type'.
非常感谢您的帮助.
对于多个排序条件,请从第一个条件到最后一个条件进行操作: 如果一个条件的两个条目不相等,则可以从排序函数返回结果为-1或1.此外,在最后一个条件下,两个相等的输入也可以返回0.
For multiple sort criteria you proceed from the first to the last criterion: If the two entries for one criterion are not equal, you can return from the sort function with result -1 or 1. Additionally at the last criterion you also can return 0 for two equal inputs.
这是您的案例的示例实现:
Here is an example implementation for your case:
byNameDefault.sort(function (a, b) {
// compare names
var na = a.name.toLowerCase();
var nb = b.name.toLowerCase();
if (na !== nb) {
if (na === 'foo')
return -1;
else if (nb === 'foo')
return 1;
else
return na < nb ? -1 : 1;
}
// compare types
return a.type < b.type ? -1 : a.type > b.type ? 1 : 0;
}