首页 > 解决方案 > 两次调用javascript排序函数的不同输出

问题描述

我在javascript中遇到排序问题。我写了一个简单的排序函数,我希望 null 元素在顶部:

这是功能:

var mySort = function(a, b) {
 if (!a && !b) return 0;
 if (!a) return -1;
 if (!b) return -1;
 if (a > b) return 1;
 if (a < b) return -1;
 return 0;
}

我们以下面的数组为例:

var array = [1, 9, 4, 8, null, 2, 3, 4, null, 6, 3, 2, 8, 9, 5];

通过调用array.sort(mySort)非空值总是排序,但空值位置交替从数组的开头和结尾:

Odd calls: [null, null, 1, 2, 2, 3, 3, 4, 4, 5, 6, 8, 8, 9, 9]
Even calls: [1, 2, 2, 3, 3, 4, 4, 5, 6, 8, 8, 9, 9, null, null]

为什么?

编辑:
在评论中,HMR 将我引向算法中的错误:if (!b) return -1;应该是if (!b) return 1;. 现在它适用于刺痛和数字。

标签: javascriptsortingnull

解决方案


您需要使用两个项目之间的关系。如果两个项目都是null,那么什么都不改变,如果你有一个null值,那么它取决于位置。

最好的方法是检查项目并获取检查的增量进行排序。

function mySort(a, b) {
    return (b === null) - (a === null) || a - b;
}

var array = [1, 9, 4, 8, null, 2, 3, 4, null, 6, 3, 2, 8, 9, 5];

array.sort(mySort);
console.log(array);

array.sort(mySort);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读