gpt4 book ai didi

javascript - 任何人都可以解释这种关于数组排序的奇怪行为吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:56:30 26 4
gpt4 key购买 nike

我有一个这样的数组

a = [0, "-", "-", "-", "-", "-", -0.2, -0.05, 0.25, 0.47, 0.875] .

注意这个数组中有一些'-',只有这个字符串出现,左边是数字。

现在我对这个数组应用排序,就像

a = [0, "-", "-", "-", "-", "-", -0.2, -0.05, 0.25, 0.47, 0.875];
console.log(a.sort((a, b) => (+a || -Infinity) - (+b || -Infinity)));

a = [0, "-", "-", "-", "-", "-", -0.2, -0.05, 0.25, 0.47, 0.875];
console.log(a.sort((a, b) => (+b || -Infinity) - (+a || -Infinity)));

我试过的结果是这样的

enter image description here

那么问题来了。为什么 desc 顺序工作正常但 asc 顺序不行?

最佳答案

数组 [0, "-"]["-", 0] 虽然不同,但都根据您的排序规则正确“排序”已定义。

了解 javascript sort 方法不是稳定的排序。如果您正在排序的列表中有多个等价项目,这些等价项目将被组合在一起。但是,在这些组中的每一个中,顺序是未定义的。

您正在使用的比较函数将 0 和“-”定义为等价。

+0 是错误的,因此 +0 || -Infinity 将返回 -Infinity

+"-" 解析为 NaN,这也是错误的,因此 +"-"|| -Infinity 将返回 -Infinity

降序排序时 0 恰好出现在 - 之前的事实只是一个实现细节。在不同的 javascript 引擎上尝试,或在下一次 Chrome 更新后再次尝试,您可能会得到不同的结果,但仍然是正确的。


如果您希望将 0 视为数字(得到 ['-', -0.2, -0.05, 0, 0.25, 0.48, 0.875] 的排序结果),那么您可以使用这个:

a.sort(
(l,r ) =>
(typeof(l) === 'number' ? l : -Infinity) -
(typeof(r) === 'number' ? r : -Infinity)
);

关于javascript - 任何人都可以解释这种关于数组排序的奇怪行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57086962/

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