[英]Can any one explain this strange behavior about Array sort?
我有这样的数组
a = [0, "-", "-", "-", "-", "-", -0.2, -0.05, 0.25, 0.47, 0.875]
。
注意这个数组中有一些' - ',只显示这个字符串,左边是数字。
现在我对这个数组应用sort,就像
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, "-"]
和["-", 0]
虽然不同,但都根据您定义的排序规则正确“排序”。
理解javascript sort
方法不是一个稳定的排序。 如果您要排序的列表中有多个等效项,则这些等效项将组合在一起。 但是,在每个组中,订单都是不确定的。
您使用的比较函数定义0
和' - '是等效的。
+0
是假的,因此+0 || -Infinity
+0 || -Infinity
将返回-Infinity
。
+"-"
解析为NaN
,这也是假的,因此+"-" || -Infinity
+"-" || -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)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.