我有一个对象列表,我希望基于类型字符串的字段attr进行排序。我试着用
list.sort(function (a, b) {
return a.attr - b.attr
})
但发现-似乎不适用于JavaScript中的字符串。我如何能排序基于类型字符串的属性的对象列表?
我有一个对象列表,我希望基于类型字符串的字段attr进行排序。我试着用
list.sort(function (a, b) {
return a.attr - b.attr
})
但发现-似乎不适用于JavaScript中的字符串。我如何能排序基于类型字符串的属性的对象列表?
当前回答
答案(现代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;
其他回答
因为在javascript中可以直接比较字符串,所以这样做就可以了
list.sort(function (a, b) {
return a.attr < b.attr ? -1: 1;
})
这比使用更有效率
return a.attr > b.attr ? 1: -1;
因为如果元素具有相同的attr (a.t attr == b.t attr),排序函数将毫无理由地交换两者。
例如
var so1 = function (a, b) { return a.atr > b.atr ? 1: -1; };
var so2 = function (a, b) { return a.atr < b.atr ? -1: 1; }; // better
var m1 = [ { atr: 40, s: "FIRST" }, { atr: 100, s: "LAST" }, { atr: 40, s: "SECOND" } ].sort (so1);
var m2 = [ { atr: 40, s: "FIRST" }, { atr: 100, s: "LAST" }, { atr: 40, s: "SECOND" } ].sort (so2);
// m1 sorted but ...: 40 SECOND 40 FIRST 100 LAST
// m2 more efficient: 40 FIRST 40 SECOND 100 LAST
按照你的例子使用String.prototype.localeCompare:
list.sort(function (a, b) {
return ('' + a.attr).localeCompare(b.attr);
})
我们强制a.attr为字符串以避免异常。从Internet Explorer 6和Firefox 1开始就支持localeCompare。你可能还会看到下面的代码不尊重区域设置:
if (item1.attr < item2.attr)
return -1;
if ( item1.attr > item2.attr)
return 1;
return 0;
var str = ['v','a','da','c','k','l']
var b = str.join('').split('').sort().reverse().join('')
console.log(b)
在第一个问题的操作中,您正在执行以下操作:
item1.attr - item2.attr
所以,假设这些是数字(即item1。Attr = "1", item2。attr =" 2")您仍然可以使用"==="运算符(或其他严格求值符),只要您确保类型。以下方法应该有效:
return parseInt(item1.attr) - parseInt(item2.attr);
如果它们是字母和数字,那么使用localCompare()。
list.sort(function(item1, item2){
return +(item1.attr > item2.attr) || +(item1.attr === item2.attr) - 1;
})
他们如何工作样本:
+('aaa'>'bbb')||+('aaa'==='bbb')-1
+(false)||+(false)-1
0||0-1
-1
+('bbb'>'aaa')||+('bbb'==='aaa')-1
+(true)||+(false)-1
1||0-1
1
+('aaa'>'aaa')||+('aaa'==='aaa')-1
+(false)||+(true)-1
0||1-1
0