对一个数字数组进行排序,使得null值排在最后。

7

我有一个类似于这样的数组:

var arr = [5, 25, null, 1, null, 30]

使用以下代码将数组从小到大排序,这是输出的结果:

null null 1 5 25 30

arr.sort(function (a, b) {
    return a - b;
};

然而,我希望空值显示在最后,如下所示:

1 5 25 30 null null

我查看了Sort an array so that null values always come last并尝试了这段代码,但输出仍然与第一个相同——空值首先出现:
arr.sort(function (a, b) {
        return (a===null)-(b===null) || +(a>b)||-(a<b);
};
2个回答

5
你可以首先按非null排序,然后再按数字排序。

var arr = [5, 25, null, 1, null, 30]

arr.sort(function(a, b) {
  return (b != null) - (a != null) || a - b;
})

console.log(arr)


1
@razorsyntax arr.sort((a, b) => (b != null) - (a != null) || b - a) - Nenad Vracar
@NenadVracar 如果你想要先放置 null,你该怎么做呢? - Abhishek Ekaanth
@NenadVracar,你能解释一下返回语句的第一部分发生了什么吗?我很难理解它到底在做什么。 - Thomas Allen
1
@ThomasAllen 如果a为null且b不为null,则表达式的第一部分结果将为1,因为(b!= null) - (a!= null) = true-false = 1-0 = 1,当a不为null且b为null时,结果将为-1。如果a和b都不为null,则第一个条件的结果为0,因为false-false = 0-0 = 0,然后调用表达式的第二部分,即||之后的a-b - Nenad Vracar
1
@AbhishekEkaanth 在返回表达式的第一部分中只需交换a和b,如下所示 https://jsfiddle.net/812y4j5c/1/ - Nenad Vracar
显示剩余2条评论

1
我会使用严格比较与null进行比较,因为任何类型转换都被省略了,你只需要对于排序的第二部分使用ab的差值。

给定的示例适用于具有空值或某些属性的对象,例如给定键numberfor,该键在空值和数字的数组中不可用。

var array = [5, 25, null, 1, null, 30];

array.sort(function(a, b) {
    return (a === null) - (b === null) || a - b;
});

console.log(array);


好的解决方案,但有点“棘手”。如果我浏览代码,肯定需要再看一眼。 - Evan Trimboli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接