我有一个字符串数组,我需要在JavaScript中排序,但以不区分大小写的方式。如何做到这一点?
当前回答
现在是时候重新审视这个老问题了。
您不应该使用依赖toLowerCase的解决方案。它们效率很低,而且在某些语言(例如土耳其语)中根本不起作用。喜欢这个:
['Foo', 'bar'].sort((a, b) => a.localeCompare(b, undefined, {sensitivity: 'base'}))
查看浏览器兼容性文档,了解灵敏度选项的所有信息。
其他回答
在/ /i中包装字符串。这是使用正则表达式忽略大小写的一种简单方法
如果不管输入数组中元素的顺序如何,你都想保证相同的顺序,这里是一个稳定排序:
myArray.sort(function(a, b) {
/* Storing case insensitive comparison */
var comparison = a.toLowerCase().localeCompare(b.toLowerCase());
/* If strings are equal in case insensitive comparison */
if (comparison === 0) {
/* Return case sensitive comparison instead */
return a.localeCompare(b);
}
/* Otherwise return result */
return comparison;
});
其他答案假设数组包含字符串。我的方法更好,因为即使数组包含null、undefined或其他非字符串,它也能工作。
var notdefined;
var myarray = ['a', 'c', null, notdefined, 'nulk', 'BYE', 'nulm'];
myarray.sort(ignoreCase);
alert(JSON.stringify(myarray)); // show the result
function ignoreCase(a,b) {
return (''+a).toUpperCase() < (''+b).toUpperCase() ? -1 : 1;
}
null将在'nulk'和'nulm'之间排序。但未定义的总是排在最后。
在(几乎:)一行代码中
["Foo", "bar"].sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
结果是
[ 'bar', 'Foo' ]
而
["Foo", "bar"].sort();
结果
[ 'Foo', 'bar' ]
为了支持已接受的答案,我想补充一点,下面的函数似乎改变了原始数组中的值,以便不仅对小写进行排序,而且大写值也将被更改为小写。这对我来说是一个问题,因为即使我希望看到玛丽在玛丽旁边,我也不希望第一个值玛丽的大小写改为小写。
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());
});