javascript - 两次调用javascript排序函数的不同输出

标签 javascript sorting null

我在 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/

相关文章:

javascript - 在 React Native 回调后重定向

javascript - 单击按钮后 jQuery 函数不起作用?

c# - 对其中包含 NaN 的 Double 数组进行排序

sql - SQLite,识别空的非空单元格

comparison - 测试 Postgresql 数组字段是空还是空的正确方法是什么

javascript - 如何重新创建 Underscore.js _.reduce 方法?

javascript - 单击删除按钮时突出显示评论并删除类

algorithm - 从 Intro 到 Algorithms 的计数排序的奇怪步骤

algorithm - 按词典顺序对单词进行排序

字符串中的 Java 空字符