[英]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
:
return
表达式的第一部分检查sequence
存在, 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.