谁能解释一下有关数组排序的奇怪行为?

时间:2019-07-18 04:04:09

标签: javascript arrays sorting

我有一个像这样的数组

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命令却不能呢?

1 个答案:

答案 0 :(得分:5)

数组[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)
);