繁体   English   中英

Array.sort safari问题

[英]Array.sort safari issue

我有阵列:

var arr = [
    {id: "d", sequence: 3},
    {id: "c", sequence: 4},
    {id: "b", sequence: 2},
    {id: "a", sequence: 1},
    {id: "e"}
];

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

  • 没有sequence元素应该是第一个
  • 其他应按降序sequence

我的解决方案是:

arr.sort(function(a, b) {
  if (!a.sequence || !b.sequence) return 1;
  return b.sequence - a.sequence;
});

我期待以下订单:

[{id: "e"}, {id: "c", sequence: 4}, {id: "d", sequence: 3}, ...]

但在safari收到:

[
  {id: "c", sequence: 4}, 
  {id: "d", sequence: 3},
  {id: "b", sequence: 2},
  {id: "a", sequence: 1},
  {id: "e"}
]

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

谢谢你提前!

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

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;
});

(这可能只需要少一些代码就可以完成;为了清楚起见,它是明确的。)排序比较器函数始终为每对元素(按任意顺序)返回一致的结果,这一点很重要。

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

您可以像这样使用#sort

  1. return表达式的第一部分检查sequence存在,
  2. 而第二部分按降序排列arr

见下面的演示:

 var arr=[{id:"d",sequence:3},{id:"c",sequence:4},{id:"b",sequence:2},{id:"a",sequence:1},{id:"e"}]; var result = arr.sort(function(a, b) { return +('sequence' in a) - +('sequence' in b) || b.sequence - a.sequence }); console.log(result); 
 .as-console-wrapper{top:0;max-height:100%!important;} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM