我有一个对象列表,我希望基于类型字符串的字段attr进行排序。我试着用

list.sort(function (a, b) {
    return a.attr - b.attr
})

但发现-似乎不适用于JavaScript中的字符串。我如何能排序基于类型字符串的属性的对象列表?


当前回答

直接使用sort(),不带任何-或<

Const区域=['山','海滩','沙漠','山'] console.log (areas.sort ()) //以降序方式打印 .reverse console.log (areas.sort () ())

其他回答

答案(现代ECMAScript)

list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr))

Or

list.sort((a, b) => +(a.attr > b.attr) || -(a.attr < b.attr))

描述

将一个布尔值转换为一个数字会产生以下结果:

True -> 1 .单击“确定” False -> 0

考虑三种可能的模式:

X大于y: (X > y) - (y < X) -> 1 - 0 -> 1 X等于y:(X > y) - (y < X) -> 0 - 0 -> 0 X小于y:(X > y) - (y < X) -> 0 -1 -> -1

(替代)

x比y: + (x > y) | | - - - - - - (x < y) - > 1 | | 0 - > 1 x等于y: + (x > y) | | - - - - - - (x < y) - > 0 | | 0 - > 0 x小于y: + (x > y) | | - - - - - - (x < y) - > 0 | | 1 - > 1

这些逻辑等价于典型的排序比较器函数。

if (x == y) {
    return 0;
}
return x > y ? 1 : -1;

这里应该使用>或<和==。所以解决方案是:

list.sort(function(item1, item2) {
    var val1 = item1.attr,
        val2 = item2.attr;
    if (val1 == val2) return 0;
    if (val1 > val2) return 1;
    if (val1 < val2) return -1;
});

嵌套三元箭头函数

(a,b) => (a < b ? -1 : a > b ? 1 : 0)

在第一个问题的操作中,您正在执行以下操作:

item1.attr - item2.attr

所以,假设这些是数字(即item1。Attr = "1", item2。attr =" 2")您仍然可以使用"==="运算符(或其他严格求值符),只要您确保类型。以下方法应该有效:

return parseInt(item1.attr) - parseInt(item2.attr);

如果它们是字母和数字,那么使用localCompare()。

var str = ['v','a','da','c','k','l']
var b = str.join('').split('').sort().reverse().join('')
console.log(b)