这个排序函数内部的机制是什么
what is the mechanism going on inside this sort function
我已经了解了这个 article 关于 Array.prototype.sort() 的内容。Sort() 函数可以根据使用 UNICODE [=20] 进行排序的 compareFunction.For 字符串的可用性而表现不同=] 在这个特定的例子中,一个数组包含两个不同的元素,它们具有 相同的前三个字母 。我的问题是 compareFunction 如何决定先进入哪个元素像这样的情况??
var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers); //['Hammer','Hamburger']
我认为您遇到了问题,因为在 compareFunction 中您说的是
a-b;
记住 "str1"-"str2"
会 return 一个 NaN
。所以你不会得到预期的结果。
如果你想按升序排序,请像下面这样说
a>b;
或
a.localeCompare(b);
完整代码
var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
return a.localeCompare(b);
});
console.log(numbers); //["Hamburger", "Hammer"]
此方法不适用于字符串值
To compare numbers instead of strings, the compare function can simply subtract b from a:
function compareNumbers(a, b) {
return a - b;
}
也就是说,这应该只用于数字而不适用于字符串。
对非 ASCII 字符进行排序
"For sorting strings with non-ASCII characters, i.e. strings with accented characters (e, é, è, a, ä, etc.), strings from languages other than English: use String.localeCompare. This function can compare those characters so they appear in the right order.:"
var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
return a.localeCompare(b);
});
// items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
否则,只需使用普通的 .sort() 并且不要担心实现,除非它对您来说很奇怪
var fruit = ['apples', 'bananas', 'Cherries'];
fruit.sort(); // ['Cherries', 'apples', 'bananas'];
.sort(function(){})
行为如下(returned 变量将被称为 result
):
1) result
< 0 - 第二个元素比第一个大;
2) result
= 0 - 第二个元素等于第一个元素;
3) result
> 0 - 第二个元素小于第一个元素;
所以这个算法只适用于数字,当比较字符串时,"str1" - "str2"
会returnNaN
你可以用字符串数组这样做:
function compareString(a, b)
{
var lowera = a.toLowerCase();
var lowerb = b.toLowerCase();
if (lowera < lowerb){
return -1;
}else if (lowera > lowerb){
return 1;
}else{
return 0;
}
}
var numbers = ['Hammer',"Hamburger"];
numbers.sort(compareString);
console.log(numbers); //['Hamburger','Hammer']
我已经了解了这个 article 关于 Array.prototype.sort() 的内容。Sort() 函数可以根据使用 UNICODE [=20] 进行排序的 compareFunction.For 字符串的可用性而表现不同=] 在这个特定的例子中,一个数组包含两个不同的元素,它们具有 相同的前三个字母 。我的问题是 compareFunction 如何决定先进入哪个元素像这样的情况??
var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers); //['Hammer','Hamburger']
我认为您遇到了问题,因为在 compareFunction 中您说的是
a-b;
记住 "str1"-"str2"
会 return 一个 NaN
。所以你不会得到预期的结果。
如果你想按升序排序,请像下面这样说
a>b;
或
a.localeCompare(b);
完整代码
var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
return a.localeCompare(b);
});
console.log(numbers); //["Hamburger", "Hammer"]
此方法不适用于字符串值
To compare numbers instead of strings, the compare function can simply subtract b from a:
function compareNumbers(a, b) {
return a - b;
}
也就是说,这应该只用于数字而不适用于字符串。
对非 ASCII 字符进行排序
"For sorting strings with non-ASCII characters, i.e. strings with accented characters (e, é, è, a, ä, etc.), strings from languages other than English: use String.localeCompare. This function can compare those characters so they appear in the right order.:"
var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
return a.localeCompare(b);
});
// items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
否则,只需使用普通的 .sort() 并且不要担心实现,除非它对您来说很奇怪
var fruit = ['apples', 'bananas', 'Cherries'];
fruit.sort(); // ['Cherries', 'apples', 'bananas'];
.sort(function(){})
行为如下(returned 变量将被称为 result
):
1) result
< 0 - 第二个元素比第一个大;
2) result
= 0 - 第二个元素等于第一个元素;
3) result
> 0 - 第二个元素小于第一个元素;
所以这个算法只适用于数字,当比较字符串时,"str1" - "str2"
会returnNaN
你可以用字符串数组这样做:
function compareString(a, b)
{
var lowera = a.toLowerCase();
var lowerb = b.toLowerCase();
if (lowera < lowerb){
return -1;
}else if (lowera > lowerb){
return 1;
}else{
return 0;
}
}
var numbers = ['Hammer',"Hamburger"];
numbers.sort(compareString);
console.log(numbers); //['Hamburger','Hammer']