gpt4 book ai didi

javascript - 为什么这个 Array.sort 行为在 Chrome 和 Node.js 中不同

转载 作者:行者123 更新时间:2023-11-29 16:31:31 26 4
gpt4 key购买 nike

问题

让我们制作一个基本列表并对其进行排序,以确保 2 始终位于列表的第一位。很简单,对吧?

[1, 2, 3].sort((a, b) => {
if (a === 2) return -1;
return 0;
});

Chrome 结果:✓

[2, 1, 3]

Node 结果:X

[1, 2, 3]

为了在 Node 中获得这种行为,您可以 - 很奇怪 - 查看 b 参数,如果它是 2 则让它返回 1:

[1, 2, 3].sort((a, b) => {
if (b === 2) return 1;
return 0;
});

使用这个实现你会得到相反的结果; Chrome 将为 [1, 2, 3],Node 将为 [2, 1, 3]。

问题

您对这种行为有合理的解释吗?我的排序功能在概念上有缺陷吗?如果是这样,您将如何编写这种排序行为?

最佳答案

Do you have a logical explaination for this behaviour?

浏览器使用不同的排序方法。因此,他们可能会以不同的顺序使用不同的参数调用提供的回调。如果你的排序函数不一致,排序就不稳定。这将导致错误的排序顺序(对于不同的输入数组也总是如此,因此您的排序永远不会真正起作用)。

If so, how would you write this sorting behaviour?

确保这两个条件适用于每个可能的输入:

1) 不应对两个相等的元素进行排序:

  sort(a, a) === 0

2) 如果以相反的顺序调用排序函数,则结果也是相反的:

  sort(a, b) - sort(b, a) === 0

在你的例子中,两者都没有填满:

  sort(2, 2) // 1 -> wrong!
sort(2, 3) - sort(3, 2) // 1 -> wrong!

要编写稳定的排序,您必须查看a b:

  function(a, b) {
if(a === 2 && b === 2)
return 0;
if(a === 2)
return 1;
if(b === 2)
return -1;
return 0;
}

或者更短一些:

  (a, b) => (a === 2) - (b === 2)

关于javascript - 为什么这个 Array.sort 行为在 Chrome 和 Node.js 中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com