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中它是第一个?
谢谢你提前!
您的排序比较器不会按照您的要求执行.如果你想缺少一个"序列"属性来表示一个元素应该在具有这样一个属性的元素之前,你的返回值必须反映出:
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)
(这可能可能与少一些代码来完成,这是明确的清晰度.)这是很重要的一种比较函数总是返回一致的结果为每对元素(以任何顺序).
您的现有代码在浏览器之间的行为不同,因为排序实现因运行时系统而异