这个排序函数内部的机制是什么



我已经阅读了这篇关于Array.prototype.sort()的文章。Sort() 函数可以根据 compareFunction 的可用性而表现得不同。对于字符串,它使用 UNICODE 值进行排序。但是在这个特定的例子中,数组包含两个具有相同前三个字母的不同元素。我的问题是,在这种情况下,compare函数如何决定先走哪一个?

var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers); //['Hammer','Hamburger']

我认为你遇到了问题,因为在比较函数中你说的是

a-b; 

请记住"str1"-"str2"将返回一个NaN。所以你不会得到预期的结果。

如果您想按升序排序,请像波纹管一样说

a>b;

a.localeCompare(b);

完整代码

var numbers = ['Hammer',"Hamburger"];
numbers.sort(function(a, b) {
  return a.localeCompare(b);
});
console.log(numbers); //["Hamburger", "Hammer"]

此方法不适用于字符串值

要比较数字而不是字符串,比较函数可以简单地从 a 中减去 b:

function compareNumbers(a, b) {
    return a - b;
}

话虽如此,这应该仅用于数字,不适用于字符串。

对非 ASCII 字符进行排序

"要对带有非ASCII字符的字符串进行排序,即带有重音字符(e,é,è,a,ä等)的字符串,来自英语以外语言的字符串:使用String.localeCompare。此函数可以比较这些字符,以便它们以正确的顺序显示。

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'];

你可以用字符串数组这样做:

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']

.sort(function(){})的行为如下(返回的变量将称为result):

1) result <0 - 第二个元素大于第一个元素;

2) result = 0 - 第二个元素等于第一个元素;

3)result>0-第二元素小于第一元素;

所以这个算法只适用于数字,在比较字符串时,"str1" - "str2"会返回NaN

最新更新