Array.sort safari问题

Nat*_*san 2 javascript arrays sorting

我有阵列:

var arr = [
    {id: "d", sequence: 3},
    {id: "c", sequence: 4},
    {id: "b", sequence: 2},
    {id: "a", sequence: 1},
    {id: "e"}
];
Run Code Online (Sandbox Code Playgroud)

并希望按照逻辑对其进行排序:

  • 元素不sequence应该是第一个
  • 其他应按降序排序sequence.

我的解决方案是:

arr.sort(function(a, b) {
  if (!a.sequence || !b.sequence) return 1;
  return b.sequence - a.sequence;
});
Run Code Online (Sandbox Code Playgroud)

我期待以下订单:

[{id: "e"}, {id: "c", sequence: 4}, {id: "d", sequence: 3}, ...]
Run Code Online (Sandbox Code Playgroud)

但在safari收到:

[
  {id: "c", sequence: 4}, 
  {id: "d", sequence: 3},
  {id: "b", sequence: 2},
  {id: "a", sequence: 1},
  {id: "e"}
]
Run Code Online (Sandbox Code Playgroud)

为什么在Safari中{id: "e"}是最后一个元素,在Chrome和Firefox中它是第一个?

谢谢你提前!

Poi*_*nty 7

您的排序比较器不会按照您的要求执行.如果你想缺少一个"序列"属性来表示一个元素应该在具有这样一个属性的元素之前,你的返回值必须反映出:

arr.sort(function(a, b) {
  if (("sequence" in a) && !("sequence" in b))
    return 1;
  if (("sequence" in b) && !("sequence" in a))
    return -1;
  if (!("sequence" in a) && !("sequence" in b))
    return 0;
  return b.sequence - a.sequence;
});
Run Code Online (Sandbox Code Playgroud)

(这可能可能与少一些代码来完成,这是明确的清晰度.)这是很重要的一种比较函数总是返回一致的结果为每对元素(以任何顺序).

您的现有代码在浏览器之间的行为不同,因为排序实现因运行时系统而异