如何在JavaScript中对字符串进行排序

我有一个我希望根据字符串类型的attr进行排序的对象列表。 我试着用-

list.sort(function (a, b) {
    return a.attr - b.attr
})

但发现-似乎不适用于JavaScript中的字符串。 我如何根据类型为string的属性对对象列表进行排序?


这应该工作:

if (item1.attr < item2.attr)
  return -1
if ( item1.attr > item2.attr)
  return 1
return 0

更好的是,你可以使用String.prototype.localeCompare

return item1.attr.localeCompare(item2.attr);

更新的答案(2014年10月)

我真的很烦恼这个字符串的自然排序顺序,所以我花了相当一段时间来调查这个问题。 我希望这有帮助。

长话短说

localeCompare()字符支持是坏蛋,只是使用它。 正如Shog9所指出的Shog9 ,你的问题的答案是:

return item1.attr.localeCompare(item2.attr);

在所有自定义javascript“自然字符串排序顺序”实现中发现的错误

在那里有相当多的自定义实现,试图进行字符串比较,更精确地称为“自然字符串排序顺序”

当用这些实现“玩”时,我总是会注意到一些奇怪的“自然排序”选择,或者说错误(或者最好的情况下的遗漏)。

通常情况下,特殊字符(空格,短划线,&符,括号等)处理不正确。

然后你会发现它们出现在不同的地方,通常可能是:

  • 一些将在大写'Z'和小写'a'之间
  • 有些会介于'9'和大写字母'A'之间
  • 有些会在小写'z'后面
  • 当人们预期特殊字符在一个地方被“分组”在一起时,除了空格特殊字符(可能总是第一个字符)。 也就是说,无论是在数字之前,还是在数字和字母之间(小写字母和大写字母“一个接一个”),或者全部在字母之后。

    我的结论是,当我开始添加几乎不寻常的字符(即带有变音符或字符的字符,如短划线,感叹号等)时,它们都不能提供一致的顺序。

    自定义实现的研究:

  • Natural Compare Lite https://github.com/litejs/natural-compare-lite:一直排序失败https://github.com/litejs/natural-compare-lite/issues/1和http://jsbin.com / bevututodavi / 1 /编辑?js,控制台,基本拉丁字符排序http://jsbin.com/bevututodavi/5/edit?js,console
  • Natural Sort https://github.com/javve/natural-sort:一直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( localeCompare() .aspx(向下滚动localeCompare()方法)。 内置的localeCompare()方法在排序方面做得更好,甚至是国际化和特殊字符。 使用localeCompare()方法的唯一问题是“所用的语言环境和排序顺序完全依赖于实现”。 换句话说,当使用localeCompare时,比如stringOne.localeCompare(stringTwo):Firefox,Safari,Chrome和IE对Strings有不同的排序顺序。

    对浏览器本地实现的研究:

  • http://jsbin.com/beboroyifomu/1/edit?js,console - 基本拉丁字符与localeCompare()比较http://jsbin.com/viyucavudela/2/ - 基本拉丁字符与localeCompare()比较用于测试on IE8
  • http://jsbin.com/beboroyifomu/2/edit?js,console - 字符串比较中的基本拉丁字符:字符串中的一致性检查vs字符单独时的一致性检查
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare - IE11 +支持新的语言环境和选项参数
  • “字符串自然排序”的难度

    实现一个可靠的算法(意味着:一致,但也涵盖了广泛的角色)是一项非常艰巨的任务。 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);
    

    进一步阅读:

  • https://softwareengineering.stackexchange.com/questions/257286/is-there-any-language-agnostic-specification-for-string-natural-sorting-order
  • 你如何在JavaScript中进行字符串比较?
  • Javascript:自然排列的字母数字字符串
  • 排序数字和字母元素数组(自然分类)
  • 对混合的alpha / numeric数组进行排序
  • https://web.archive.org/web/20130929122019/http://my.opera.com/GreyWyvern/blog/show.dml/1671288
  • https://web.archive.org/web/20131005224909/http://www.davekoelle.com/alphanum.html
  • http://snipplr.com/view/36012/javascript-natural-sort/
  • http://blog.codinghorror.com/sorting-for-humans-natural-sort-order/
  • 感谢Shog9的很好的回答,我相信这让我处于“正确”的方向


    最简单的答案与ECMAScript 2016

    list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr))
    

    要么

    list.sort((a, b) => +(a.attr > b.attr) || -(a.attr < b.attr))
    
    链接地址: http://www.djcxy.com/p/75187.html

    上一篇: How to sort strings in JavaScript

    下一篇: Why is SQL Server '=' comparator case insensitive?