JavaScript 数组排序中的奇怪行为[重复]

2024-01-15

我在尝试对 JavaScript 数组进行排序时遇到了奇怪的行为。

var arr = ['a', 'b', 'C', 'd', 'e', 'f', 'g', 'h', 'I', 'k'];

arr.sort(function (a, b) {
  console.log(a, b);
  if (a.length < b.length) return 1;
  else if (a.length > b.length) return -1;
  else return 0;
});

在这种情况下工作正常,给我返回相同的数组。

控制台是这样的,

但是当我尝试下面的输入时,

var arr = ['a', 'b', 'C', 'd', 'e', 'f', 'g', 'h', 'I', 'k', 'l'];

给我这个,

我不太明白为什么会发生这种情况。

附言。我正在编写这个自定义排序来检查元素的长度,因为我需要一个其元素根据长度排序的数组。


ECMAScript 既没有规定特定的算法,也不期望它是稳定的(Array.prototype.sort)。稳定的排序算法维持看似“相同”的元素的相对顺序。对于 Array#sort,当比较函数返回 0 时,两个项目显示相同。虽然 InsertionSort 和 MergeSort(Apple 和 Mozilla)稳定,但 QuickSort(Google Chrome)不稳定(问题 90)。如果数组有 10 个或更少的元素,Chrome 将使用插入排序对数组进行排序。

所以 Safari 和 Firefox 会排序["sed", "dolor", "ipsum", "foo", "bar", "cat", "sit", "man", "lorem", "amet", "maecennas"](按字符长度),“sed”将保持第一位置,而 Chrome 会掷骰子,可能更喜欢“cat”占据杆位。 Chrome 开发者显然喜欢 Kittens……

因此,如果您发现自己有需要,请自行实现稳定的算法,例如合并排序。

检查完整的帖子here http://blog.rodneyrehm.de/archives/14-Sorting-Were-Doing-It-Wrong.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 数组排序中的奇怪行为[重复] 的相关文章

随机推荐

  • Firebase - 新控制台中我的帐户秘密在哪里?

    我刚刚将我的项目更新到新的 Google Apps Firebase 控制台 在新控制台中 我在哪里可以找到与我的帐户关联的秘密 单击顶部项目名称旁边的设置 齿轮图标新的 Firebase 控制台 https console firebas
  • 在 Java 中显示数百万张图像的最佳方式是什么?

    你看到了吗 每栋房子的每一块砖都是一张 16x16 像素的图像 您可以在这里看到一个基于简单 JavaFX 的版本 其中包含一些Imageview在 X 和 Y 上移动以产生 构造 效果 我只是适应这个Swing using paintCo
  • 自定义Android切换轨道“动画”

    我创建了一个基本的自定义Switch 如下定义
  • Heroku + Apartment PG::错误:错误:函数 pg_stat_statements_reset() 不存在

    我在 Rails 4 中使用 Apartment gem 来支持 Heroku 上 Postgres 9 3 3 中的多租户 Apartment gem 创建新租户时出错 深入调查显示创建了一个架构 但内部没有表 Heroku 日志显示错误
  • 除了实际破解代码之外,了解 VM 实现的最佳方法是什么?

    我想了解有关虚拟机实现和优化的更多信息 现在 我正在 以很小的方式 使用 JRuby 做出贡献 并且还在使用我自己的在虚拟机中运行的类似 lisp 的语言实现进行游戏 编写 不过 我想获得有关使用虚拟机并设计它们的更多信息 除了阅读 使用现
  • Oracle 在评估 rownum 之前是否会获取所有行?

    我有一个包含数百万条记录的表 我想确保 Oracle 只要找到第一个匹配项就停止查找 select from table1 where table1 column1 somevalue AND table2 column2 somevalu
  • 数据未写入数据库

    我正在 CheckboxProcess CheckedChanged 事件中向数据库写入一个位值 然而 实际上什么也没有写出来 我里面有一些代码填充了适配器 但我把它拿出来了 有人能看出哪里出了问题吗 protected void Page
  • 禁用表单仍然允许子控件接收输入

    最近几天我在使用 delphi 时感到很头疼 我想做的很简单 在某个点阻止接口并在其他点之后启用 但听起来很简单 我无法弄清楚为什么设计允许某些事情 所以澄清一下 1 创建一个项目 2 在表单中放置一个编辑和一个按钮 编辑的Tab顺序必须是
  • Chrome / Safari 未填充 Flex 父级的 100% 高度

    我想要一个具有特定高度的垂直菜单 每个子项都必须填充父项的高度 并且文本居中对齐 孩子的数量是随机的 所以我必须使用动态值 Div container包含随机数量的子项 item 总是必须填充父级的高度 为了实现这一点 我使用了 Flexb
  • 创建 mozilla 扩展以在其中显示弹出窗口和 iframe

    我正在尝试开发一个 mozilla 扩展 我只需要在弹出窗口中显示 iframe 但不知道该怎么做 我的要求是 在顶部导航工具栏添加扩展按钮 单击扩展按钮时在弹出窗口上显示 iframe 我没有找到任何与此类似的教程 请帮我 谢谢 哈里普拉
  • PHP使用正则表达式将大写文件扩展名转换为小写

    我正在尝试实现以下转换 IM22 htp JPG gt IM22 htp jpg 到目前为止 我已经尝试了以下方法 但似乎不起作用 string IM22 htp JPG pattern w i replacement 1 strtolow
  • 在 p:datatable primefaces 之外找不到标识符为 h:selectBooleanCheckbox 的组件

    我的应用程序中有这段代码 我想将 h selectBooleanCheckbox 值提交到服务器 h selectBooleanCheckbox 位于 p tabView 内部和 p dataTable 外部 我想提交 h selectBo
  • Maven:自定义 web-app 项目的 web.xml

    我有一个 Web 应用程序 Maven 项目 我想根据正在运行的配置文件自定义 web xml 文件 我正在使用 Maven War plugin 它允许我定义一个 资源 目录 可以在其中过滤文件 然而 仅靠过滤对我来说还不够 更详细地说
  • 静态类中静态方法中的变量

    请考虑这段代码 1 public static class MyClass 2 3 public static DateTime MyMethod DateTime dt 4 5 DateTime temp new DateTime 6 t
  • 使用字符串数组声明 java 枚举

    我试图根据从数据库检索的数据声明枚举类型 我有一个方法 它返回表中所有行的字符串数组 我想将其转换为枚举类型 有没有办法用数组构造枚举 这是我尝试过的 但从它在 Eclipse 中的外观来看 这似乎只是创建了一个具有该名称的方法 publi
  • CodeMirror - 样式 Tern 智能感知标签

    我正在使用 CodeMirror 的 Tern 插件 它向编辑器添加了智能感知功能 即弹出内联提示标签 我想改变提示标签的样式 该怎么做 Tern 将 CSS 类名附加到提示框 您可以利用它们来设置样式 例如 CodeMirror Tern
  • 编写脚本来检查远程主机服务是否运行[重复]

    这个问题在这里已经有答案了 这是脚本 但即使 Apache 正在运行其 show stop 输出也是错误的 我使用的是 Ubuntu 12 04 ssh qn root ip if ps aux grep h ttpd gt dev nul
  • 发送电子邮件时出现 VBScript 错误“80040211”

    我在发送电子邮件时遇到错误 错误 80040211 这是我的代码的示例 Dim objMessage Set objMessage CreateObject CDO Message objMessage Subject Super Serv
  • 向元组添加值

    我最初使用 Idictonary 在 MVC 模型中存储字符串值 如下所示 public IDictionary
  • JavaScript 数组排序中的奇怪行为[重复]

    这个问题在这里已经有答案了 我在尝试对 JavaScript 数组进行排序时遇到了奇怪的行为 var arr a b C d e f g h I k arr sort function a b console log a b if a le