我有一个像这样的数组
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)));
我尝试的结果是这样的
问题是。 为什么desc命令可以正常工作,而asc命令却不能呢?
答案 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)
);