我在 javascript 中遇到排序问题。我写了一个简单的排序函数,我希望空元素位于顶部:
这是函数:
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;
。现在它可以很好地处理字符串和数字。
最佳答案
您需要使用两个项目之间的关系。如果两项都是 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; }
关于javascript - 两次调用javascript排序函数的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415829/