对数组进行排序,以便空值始终位于最后

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对数组进行排序,以便空值始终位于最后相关的知识,希望对你有一定的参考价值。

我需要对一个字符串数组进行排序,但我需要它以使null始终是最后一个。例如,数组:

var arr = [a, b, null, d, null]

当升序排序时,我需要像[a, b, d, null, null]一样排序,当按降序排序时,我需要像[d, b, a, null, null]那样排序。

这可能吗?我尝试了下面找到的解决方案,但这不是我需要的。

How can one compare string and numeric values (respecting negative values, with null always last)?

答案

查看.sort()并使用自定义排序。例

function alphabetically(ascending) 

  return function (a, b) 

    // equal items sort equally
    if (a === b) 
        return 0;
    
    // nulls sort after anything else
    else if (a === null) 
        return 1;
    
    else if (b === null) 
        return -1;
    
    // otherwise, if we're ascending, lowest sorts first
    else if (ascending) 
        return a < b ? -1 : 1;
    
    // if descending, highest sorts first
    else  
        return a < b ? 1 : -1;
    

  ;



var arr = [null, 'a', 'b', null, 'd'];

console.log(arr.sort(alphabetically(true)));
console.log(arr.sort(alphabetically(false)));
另一答案

使用自定义比较函数来区分null值:

arr.sort(function(a, b) 
    return (a===null)-(b===null) || +(a>b)||-(a<b);
);

对于降序,只需在直接比较中交换ab

arr.sort(function(a, b) 
    return (a===null)-(b===null) || -(a>b)||+(a<b);
);
另一答案

最简单的方法是首先处理null,然后根据所需的顺序处理非null情况:

function sortnull(arr, ascending) 
  // default to ascending
  if (typeof(ascending) === "undefined")
    ascending = true;

  var multi = ascending ? 1 : -1;

  var sorter = function(a, b) 
    if (a === b)          // identical? return 0
      return 0;
    else if (a === null)  // a is null? last 
      return 1;
    else if (b === null)  // b is null? last
      return -1;
    else                  // compare, negate if descending
      return a.localeCompare(b) * multi;
  

  return arr.sort(sorter);


var arr = ["a", "b", null, "d", null]

console.log(sortnull(arr));        // ascending   ["a", "b", "d", null, null]
console.log(sortnull(arr, true));  // ascending   ["a", "b", "d", null, null]
console.log(sortnull(arr, false)); // descending  ["d", "b", "a", null, null]
另一答案

像这样,请注意:这只会将null推到后面

var arr = ["a", null, "b"];
var arrSor = [];
arr.forEach(function (el) 

    if (el === null) 
        arrSor.push(el);
     else 
        arrSor.unshift(el);
    
);
另一答案

这样做:

        var arr = [a, b, null, d, null]

        foreach ($arr as $key => $value) 
           if($value == null)
           unset($arr[$key]);
           $arr[] = $value;

        
        // rebuild array index
        $arr = array_values($arr);

        echo '<pre>';print_r($arr);die;

以上是关于对数组进行排序,以便空值始终位于最后的主要内容,如果未能解决你的问题,请参考以下文章

使用比较对 Kendo Grid JQuery 进行排序 - 排序时将空值放在最后

如何在Mongoose中让空值排在最后?

Flash DataGrid - 排序箭头始终可见

具有未定义和空值的排序对象数组

对包含数字和字符串的数组进行排序

对字符串数组和 int 数组进行排序