繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM