Jér*_*nge 199 javascript sorting case-insensitive
我有一个字符串数组,我需要在JavaScript中排序,但不区分大小写.怎么做?
Iva*_*tov 365
在(几乎:)一个单线
["Foo", "bar"].sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
Run Code Online (Sandbox Code Playgroud)
结果如何
[ 'bar', 'Foo' ]
Run Code Online (Sandbox Code Playgroud)
而
["Foo", "bar"].sort();
Run Code Online (Sandbox Code Playgroud)
结果是
[ 'Foo', 'bar' ]
Run Code Online (Sandbox Code Playgroud)
ron*_*mbe 59
myArray.sort(
function(a, b) {
if (a.toLowerCase() < b.toLowerCase()) return -1;
if (a.toLowerCase() > b.toLowerCase()) return 1;
return 0;
}
);
Run Code Online (Sandbox Code Playgroud)
编辑: 请注意,我最初写这篇文章来说明技术,而不是考虑到性能.请参阅@Ivan Krechetov的答案以获得更紧凑的解决方案.
Zun*_*Tzu 35
是时候重温这个老问题了.
您不应该使用依赖的解决方案toLowerCase
.它们效率低下,根本不能用某些语言(例如土耳其语).喜欢这个:
['Foo', 'bar'].sort((a, b) => a.localeCompare(b, undefined, {sensitivity: 'base'}))
Run Code Online (Sandbox Code Playgroud)
查看文档以了解浏览器兼容性以及有关该sensitivity
选项的所有信息.
Nie*_*sol 24
arr.sort(function(a,b) {
a = a.toLowerCase();
b = b.toLowerCase();
if (a == b) return 0;
if (a > b) return 1;
return -1;
});
Run Code Online (Sandbox Code Playgroud)
Aal*_*abi 10
如果您想保证输入数组中元素顺序的相同顺序,这里是一个稳定的排序:
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;
});
Run Code Online (Sandbox Code Playgroud)
你也可以使用新的Intl.Collator().compare
,每个MDN,它在排序数组时更有效.缺点是旧浏览器不支持它.MDN声称在Safari中根本不支持它.需要验证它,因为它声明Intl.Collator
支持.
比较大量字符串时,例如在排序大型数组时,最好创建一个Intl.Collator对象并使用其compare属性提供的函数.
["Foo", "bar"].sort(Intl.Collator().compare); //["bar", "Foo"]
Run Code Online (Sandbox Code Playgroud)
ES6版本:
["Foo", "bar"].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }))
Run Code Online (Sandbox Code Playgroud)
来源:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare
您还可以使用 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);
Run Code Online (Sandbox Code Playgroud)
给出:
biscuit,Bob,charley,fudge,Fudge
Run Code Online (Sandbox Code Playgroud)
不过 localeCompare 方法可能没问题......
注意:Elvis 运算符是 if then else 的缩写形式“三元运算符”,通常带有赋值。
如果你从侧面看 ?:,它看起来像 Elvis...
即,而不是:
if (y) {
x = 1;
} else {
x = 2;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用:
x = y?1:2;
Run Code Online (Sandbox Code Playgroud)
即当 y 为 true 时,则返回 1(用于分配给 x),否则返回 2(用于分配给 x)。
归档时间: |
|
查看次数: |
89678 次 |
最近记录: |