我有一个对象列表,我希望基于类型字符串的字段attr进行排序。我试着用
list.sort(function (a, b) {
return a.attr - b.attr
})
但发现-似乎不适用于JavaScript中的字符串。我如何能排序基于类型字符串的属性的对象列表?
我有一个对象列表,我希望基于类型字符串的字段attr进行排序。我试着用
list.sort(function (a, b) {
return a.attr - b.attr
})
但发现-似乎不适用于JavaScript中的字符串。我如何能排序基于类型字符串的属性的对象列表?
当前回答
如果你想控制locale(或大小写或重音),那么使用Intl.collator:
const collator = new Intl.Collator();
list.sort((a, b) => collator.compare(a.attr, b.attr));
你可以像这样构造collator:
new Intl.Collator("en");
new Intl.Collator("en", {sensitivity: "case"});
...
请参阅上面的doc链接。
注意:与其他解决方案不同,它处理null,未定义的JS方式,即将它们移动到最后。
其他回答
<!doctype html>
<html>
<body>
<p id = "myString">zyxtspqnmdba</p>
<p id = "orderedString"></p>
<script>
var myString = document.getElementById("myString").innerHTML;
orderString(myString);
function orderString(str) {
var i = 0;
var myArray = str.split("");
while (i < str.length){
var j = i + 1;
while (j < str.length) {
if (myArray[j] < myArray[i]){
var temp = myArray[i];
myArray[i] = myArray[j];
myArray[j] = temp;
}
j++;
}
i++;
}
var newString = myArray.join("");
document.getElementById("orderedString").innerHTML = newString;
}
</script>
</body>
</html>
直接使用sort(),不带任何-或<
Const区域=['山','海滩','沙漠','山'] console.log (areas.sort ()) //以降序方式打印 .reverse console.log (areas.sort () ())
在javascript中,我们使用.localCompare方法对字符串进行排序
为打印稿
const data = ["jane", "mike", "salome", "ababus", "buisa", "dennis"];
const sort = (arr: string[], mode?: 'desc' | 'asc') =>
!mode || mode === "asc"
? arr.sort((a, b) => a.localeCompare(b))
: arr.sort((a, b) => b.localeCompare(a));
console.log(sort(data, 'desc'));// [ 'salome', 'mike', 'jane', 'dennis', 'buisa', 'ababus' ]
console.log(sort(data, 'asc')); // [ 'ababus', 'buisa', 'dennis', 'jane', 'mike', 'salome' ]
对JS
const data = ["jane", "mike", "salome", "ababus", "buisa", "dennis"];
/**
* @param {string[]} arr
* @param {"asc"|"desc"} mode
*/
const sort = (arr, mode = "asc") =>
!mode || mode === "asc"
? arr.sort((a, b) => a.localeCompare(b))
: arr.sort((a, b) => b.localeCompare(a));
console.log(sort(data, 'desc'));// [ 'salome', 'mike', 'jane', 'dennis', 'buisa', 'ababus' ]
console.log(sort(data, 'asc')); // [ 'ababus', 'buisa', 'dennis', 'jane', 'mike', 'salome' ]
答案(现代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;
});