如何在 JavaScript 中对字符串进行排序
我有一个对象列表,我希望根据字符串类型的字段进行排序。我尝试使用attr
-
list.sort(function (a, b) {
return a.attr - b.attr
})
但发现它似乎不适用于JavaScript中的字符串。如何根据字符串类型的属性对对象列表进行排序?-
我有一个对象列表,我希望根据字符串类型的字段进行排序。我尝试使用attr
-
list.sort(function (a, b) {
return a.attr - b.attr
})
但发现它似乎不适用于JavaScript中的字符串。如何根据字符串类型的属性对对象列表进行排序?-
使用 String.prototype.locale 根据您的
示例比较一个:
list.sort(function (a, b) {
return ('' + a.attr).localeCompare(b.attr);
})
我们强制 a.attr 为字符串以避免异常。 自 Internet Explorer 6 和 Firefox 1 以来一直受支持。您可能还会看到以下使用的不尊重区域设置的代码:localeCompare
if (item1.attr < item2.attr)
return -1;
if ( item1.attr > item2.attr)
return 1;
return 0;
我对这个字符串自然排序顺序感到非常恼火,所以我花了相当多的时间来调查这个问题。我希望这有帮助。
localeCompare()
字符支持是坏蛋,只是使用它。正如 所指出的,您的问题的答案是:Shog9
return item1.attr.localeCompare(item2.attr);
有相当多的自定义实现,试图更精确地进行字符串比较,称为“自然字符串排序顺序”
在“玩”这些实现时,我总是注意到一些奇怪的“自然排序顺序”选择,或者更确切地说是错误的(或最好情况下的遗漏)。
通常,特殊字符(空格、短划线、& 符号、方括号等)处理不正确。
然后,您会发现它们在不同的地方看起来混杂在一起,通常可能是:
当人们期望特殊字符全部“分组”在一个地方时,除了空间特殊字符可能(它总是第一个字符)。也就是说,要么全部在数字之前,要么全部在数字和字母之间(小写和大写字母一个接一个地“在一起”),要么全部在字母之后。
我的结论是,当我开始添加几乎不寻常的字符(即带有变音符号或字符的字符,如破折号,感叹号等)时,它们都无法提供一致的顺序。
关于自定义实现的研究:
Natural Compare Lite
https://github.com/litejs/natural-compare-lite:https://github.com/litejs/natural-compare-lite/issues/1 和 http://jsbin.com/bevututodavi/1/edit?js,console 一致地排序失败,基本的拉丁字符排序 http://jsbin.com/bevututodavi/5/edit?js,console Natural Sort
https://github.com/javve/natural-sort:排序一致失败,请参阅问题 https://github.com/javve/natural-sort/issues/7 并查看基本拉丁字符排序 http://jsbin.com/cipimosedoqe/3/edit?js,console Javascript Natural Sort
https://github.com/overset/javascript-natural-sort:自2012年2月以来似乎被忽视了,排序一致失败,请参阅问题 https://github.com/overset/javascript-natural-sort/issues/16
Alphanum
http://www.davekoelle.com/files/alphanum.js ,排序一致失败,请参见 http://jsbin.com/tuminoxifuyo/1/edit?js,console
localeCompare()
localeCompare()
IE6+ 支持最旧的实现(没有区域设置和选项参数),请参阅 http://msdn.microsoft.com/en-us/library/ie/s4esdbwz(v=vs.94).aspx(向下滚动到 localeCompare() 方法)。内置方法在排序方面做得更好,甚至是国际字符和特殊字符。使用该方法的唯一问题是“使用的区域设置和排序顺序完全依赖于实现”。换句话说,当使用localeCompare(如stringOne.localeCompare(stringTwo)时:Firefox,Safari,Chrome和IE对Strings有不同的排序顺序。localeCompare()
localeCompare()
对浏览器原生实现的研究:
实现一个可靠的算法(意思是:一致,但也涵盖广泛的字符)是一项非常艰巨的任务。UTF8 包含 2000 多个字符,涵盖 120 多个脚本(语言)。最后,此任务有一些规范,称为“Unicode排序规则算法”,可以在 http://www.unicode.org/reports/tr10/ 中找到。您可以在我发布的此问题上找到有关此内容的更多信息,https://softwareengineering.stackexchange.com/questions/257286/is-there-any-language-agnostic-specification-for-string-natural-sorting-order
因此,考虑到我遇到的javascript自定义实现提供的当前支持水平,我们可能永远不会看到任何接近支持所有这些字符和脚本(语言)的东西。因此,我宁愿使用浏览器的本机 localeCompare() 方法。是的,它确实有在浏览器之间不一致的缺点,但基本的测试表明它涵盖了更广泛的字符范围,允许可靠和有意义的排序顺序。
因此,正如 所指出的,您的问题的答案是:Shog9
return item1.attr.localeCompare(item2.attr);
感谢Shog9的精彩回答,这使我朝着“正确”的方向前进,我相信