如何在JavaScript中执行不区分大小写的排序?

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)

  • 如果你要涉及localeCompare(),你可以使用***的能力不区分大小写,例如:`return a.localeCompare(b,'en',{'sensitivity':'base'}); ` (81认同)
  • 请注意,并非所有平台/浏览器都支持localeCompare的高级选项.我知道在这个例子中没有使用它们,但只是为了清晰起见而想添加.[有关详细信息,请参阅MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) (9认同)
  • @Milimetric符合引用页面,某些浏览器不支持该功能(例如IE <11或Safari).这里提到的解决方案非常好,但仍然需要为某些浏览器提供backporting/polyfill. (3认同)
  • +1表示在某些情况下,当localeCompare已经默认执行时不调用toLowerCase()。您可以在此处阅读有关传递给它的参数的更多信息:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare#Parameters (2认同)
  • 如果数组很大,那么可以使用`items.sort(new Intl.Collat​​or('en')。compare)`以获得更好的性能。(请参阅[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Collat​​or)。) (2认同)
  • 当进行多次排序时,应该重用排序规则:`let collat​​or = new Intl.Collat​​or('en'); items.sort(collat​​or.compare)` (2认同)

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的答案以获得更紧凑的解决方案.

  • 这可以在每个字符串上调用两次"toLowerCase"; 将更低版本的字符串存储在变量中会更有效. (3认同)

Zun*_*Tzu 35

是时候重温这个老问题了.

您不应该使用依赖的解决方案toLowerCase.它们效率低下,根本不能用某些语言(例如土耳其语).喜欢这个:

['Foo', 'bar'].sort((a, b) => a.localeCompare(b, undefined, {sensitivity: 'base'}))
Run Code Online (Sandbox Code Playgroud)

查看文档以了解浏览器兼容性以及有关该sensitivity选项的所有信息.

  • 看起来 `['Foo', 'bar'].sort((a,b) =&gt; a.localeCompare(b))` 也有效 (2认同)
  • @Ollie Williams 没有语言环境和选项参数,使用的语言环境和排序顺序完全依赖于实现 (2认同)

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)

  • 或 `返回 a === b ?0:a&gt;b?1 : -1;` (2认同)

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)


mat*_*scb 9

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

比较大量字符串时,例如在排序大型数组时,最好创建一个Intl.Collat​​or对象并使用其compare属性提供的函数.

["Foo", "bar"].sort(Intl.Collator().compare); //["bar", "Foo"]
Run Code Online (Sandbox Code Playgroud)


Nic*_*aro 9

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


小智 5

规范化的情况下.sort().toLowerCase()


And*_*dyS 5

您还可以使用 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)。

  • 迂腐地说,这不是 Elvis 操作员。这只是一个基本的三元运算符。真正的 Elvis 运算符是空合并的,例如,而不是 `x = y ? y : z`,你可以做`x = y ?: z`。Javascript 没有实际的 Elvis 运算符,但您可以使用 `x = y || z` 以类似的方式。 (6认同)