我有一个字符串数组,我需要在JavaScript中排序,但以不区分大小写的方式。如何做到这一点?


当前回答

你也可以使用新的Intl.Collator().compare,每个MDN在排序数组时更有效。缺点是旧的浏览器不支持它。MDN声明Safari根本不支持它。需要验证它,因为它声明Intl。支持Collator。

当比较大量字符串时,例如对大型数组排序时,最好创建Intl。对象,并使用其compare属性提供的函数

["Foo", "bar"].sort(Intl.Collator().compare); //["bar", "Foo"]

其他回答

你也可以使用Elvis操作符:

arr = ['Bob', 'charley', 'fudge', 'Fudge', 'biscuit'];
arr.sort(function(s1, s2){
    var l=s1.toLowerCase(), m=s2.toLowerCase();
    return l===m?0:l>m?1:-1;
});
console.log(arr);

给:

biscuit,Bob,charley,fudge,Fudge

localeCompare方法可能很好…

注意:Elvis操作符是if then else的“三元操作符”的缩写形式,通常带有赋值。 如果你从侧面看,它看起来像猫王… 例如:

if (y) {
  x = 1;
} else {
  x = 2;
}

你可以使用:

x = y?1:2;

也就是说,当y为真时,则返回1(用于赋值给x),否则返回2(用于赋值给x)。

用. tolowercase()规范.sort()中的case。

arr.sort(function(a,b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if( a == b) return 0;
    if( a > b) return 1;
    return -1;
});

在上面的函数中,如果我们只比较小写的两个值a和b,我们将不会得到漂亮的结果。

例如,如果数组是[A, A, B, B, c, c, D, D, e, e],我们使用上面的函数,我们就得到了这个数组。它没有改变任何东西。

为了使结果为[A, A, B, B, C, C, D, D, E, E],当两个小写值相等时,我们应该再次进行比较:

function caseInsensitiveComparator(valueA, valueB) {
    var valueALowerCase = valueA.toLowerCase();
    var valueBLowerCase = valueB.toLowerCase();

    if (valueALowerCase < valueBLowerCase) {
        return -1;
    } else if (valueALowerCase > valueBLowerCase) {
        return 1;
    } else { //valueALowerCase === valueBLowerCase
        if (valueA < valueB) {
            return -1;
        } else if (valueA > valueB) {
            return 1;
        } else {
            return 0;
        }
    }
}

为了支持已接受的答案,我想补充一点,下面的函数似乎改变了原始数组中的值,以便不仅对小写进行排序,而且大写值也将被更改为小写。这对我来说是一个问题,因为即使我希望看到玛丽在玛丽旁边,我也不希望第一个值玛丽的大小写改为小写。

myArray.sort(
  function(a, b) {
    if (a.toLowerCase() < b.toLowerCase()) return -1;
    if (a.toLowerCase() > b.toLowerCase()) return 1;
    return 0;
  }
);

在我的实验中,下面的函数从接受的答案正确排序,但没有改变值。

["Foo", "bar"].sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());
});

在/ /i中包装字符串。这是使用正则表达式忽略大小写的一种简单方法