array.prototype.sort当前有不同的顺序吗?

时间:2018-09-30 03:58:35

标签: javascript arrays sorting

这是我的代码:

let arr = [
  { a: false, index: 1 },
  { a: true, index: 2 },
  { a: false, index: 3 },
  { a: true, index: 4 },
  { a: true, index: 5 },
]

arr.sort((a, b) => a.a && !b.a ? 1 : -1)

在Chrome中,返回

[
  {a: false, index: 1},
  {a: false, index: 3},
  {a: true, index: 2},
  {a: true, index: 4},
  {a: true, index: 5},
]

这是我的目标结果。

但是我在Safari中找到了相同的代码:

[
  {a: false, index: 3},
  {a: false, index: 1},
  {a: true, index: 5},
  {a: true, index: 4},
  {a: true, index: 2},
]

他们有不同的结果吗?

毕竟,我通过这种方式解决了这个问题:

arr.sort(
  (a, b) =>
    !a.a && b.a
      ? -1
      : a.a === b.a
        ? 0
        : 1
)

我无法获得差异吗?

2 个答案:

答案 0 :(得分:0)

浏览器具有sort的不同实现。如果需要的话,可以使用其他排序/过滤器对其进行更多组织,或者更改当前的排序功能以也考虑索引。

答案 1 :(得分:0)

有很多排序算法,您可以将它们定义为两组:

稳定排序和不稳定排序

  

如果两个对象相等,则说排序算法是稳定的   键在排序输出中的显示顺序与在   未排序的输入。而排序算法据说是不稳定的   如果有两个或更多个具有相同键的对象没有出现在   排序前后的顺序相同。

由于ECMAScript Array.prototype.sort没有定义平台应实施的算法,因此Safari和Chrome仅使用不同的算法。

V8(Chrome)对小数组(最多10个元素)使用插入排序,对大数组使用快速排序(不稳定的排序),Safari仅使用不同的排序算法