【问题标题】:Why is sort behaving different in Chrome?为什么排序在 Chrome 中表现不同?
【发布时间】:2018-10-05 22:54:39
【问题描述】:

我想以一种元素始终排在第一位的方式对数组进行排序。除此之外,顺序无关紧要。我写了以下内容并继续我的一天。

["a","b","a","b"].sort((x,y) => x === "b" ? 0 : 1);

Chrome 给了我预期的结果;

["b","b","a","a"]

但 IE 和 Safari 没有。

我了解如何获得我想要的结果,我猜问题在于浏览器对项目进行比较的方式,但我很好奇更深入的解释。

【问题讨论】:

  • "我明白如何得到我想要的结果" 你确定吗?您的比较函数调用实现定义的排序顺序。事实上,Chrome 71 并没有产生这样的结果。
  • 看看这个link。返回 '​​0' 不会改变任何东西。改为返回“-1”。
  • @JoshLee 问题更多是关于为什么这在 Chrome 中有效。我知道这可能是一种滥用,但你能解释一下为什么会这样吗? (在 Chrome 69 中测试)
  • 你的比较函数是totally inconsistent。它在 Chrome 中不起作用,只是你很幸运。
  • 比较函数根据22.1.3.24 Array.prototype.sort (comparefn)无效,所以结果是不确定的,取决于使用的排序算法。你甚至不能仅仅因为它看起来正确就确定它是否有效,它可能只是因为它看起来适合你的测试用例。

标签: javascript sorting


【解决方案1】:

您的问题已在here:

中得到解答

简而言之,您的比较函数不正确,它应该返回 1,-1, 0 作为返回值,例如:

array.sort(function(a, b) {
    if (a.id < b.id) return -1;
    if (a.id > b.id) return 1;
    return 0;
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多