【问题标题】:JS sort different behaviour in Firefox and ChromeJS 对 Firefox 和 Chrome 中的不同行为进行排序
【发布时间】:2021-06-24 09:21:37
【问题描述】:

我在 Chrome 和 Firefox 中运行基本排序,我看到两个不同的结果。 Firefox 似乎忽略了值。

const data = [
  {
    "id": "a"
  },
  {
    "id": "b"
  },
  {
    "id": "c"
  },
  {
    "id": "d"
  },
  {
    "id": "e"
  },
  {
    "id": "f"
  },
  {
    "id": "g"
  },
  {
    "id": "h"
  }
]

const sorted = data.slice().sort((project) => {
  console.log(project.id)
  return project.id === 'h' ? -1 : 0;
})

console.log(sorted[0].id === 'h');

结果:

火狐-false

Chrome - true

Firefox 中是否存在错误?

【问题讨论】:

  • 如果您对一个集合进行排序,您应该将该集合的两个元素相互比较。这也是为什么.sort()的回调应该接受两个参数的原因。
  • 请阅读documentation
  • 如何回答这个问题?你会看到 Chrome 返回 true 而 Firefox 不是
  • 我认为具体的排序算法是依赖于实现的,所以不能保证在不同的浏览器中以相同的顺序访问值。因此,如果您不正确地使用 API,您可能会得到不同的结果。

标签: javascript google-chrome firefox


【解决方案1】:

Firefox 中是否存在错误?

没有。 specification 说:

如果comparefn 不是undefined 并且不是此数组元素的一致比较函数(见下文),则排序顺序为实现定义.

换句话说,如果您没有提供适当的比较功能,那么结果顺序可能会因浏览器而异。

进一步解释了什么是一致的比较函数。除其他事项外,它指定以下需要成立:

a = a(自反性)

但您的比较函数并非如此。因为忽略了第二个参数,如果{"id": "h"}和自己比较,也会返回-1,表示元素比自己小,违反了上述规则。

【讨论】:

    【解决方案2】:

    不同的浏览器使用不同的排序算法。这会影响数组中的哪些订单元素将被传递到您传递给sort() 的回调函数中。

    回调函数接受两个参数(被比较的两个值)并且应该返回一些东西来指示它们是否相同或者哪个应该是第一个。

    sort( function (a, b) { return 1 || 0 || -1 } )
    

    当且仅当将"h" 传递给a 时,您的代码才会将"h" 排序到数组的开头。

    如果排序算法将其传递给b,那么您将把它留在原处。

    【讨论】:

      猜你喜欢
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2018-02-16
      • 2015-10-17
      • 2014-10-24
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多