Сортируйте массив так, чтобы нулевые значения всегда приходили последним

Мне нужно отсортировать массив строк, но мне это нужно, чтобы нуль всегда был последним. Например, массив:

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

При сортировке по возрастанию мне нужно, чтобы она сортировалась как [a, b, d, null, null], и при сортировке по убыванию мне нужно, чтобы она сортировалась как [d, b, a, null, null].

Возможно ли это? Я попробовал решение, найденное ниже, но это не совсем то, что мне нужно.

Как сравнить строковые и числовые значения (с учетом отрицательных значений, всегда с нулевым значением)?

Ответ 1

Проверьте .sort() и сделайте это с пользовательской сортировкой. пример

function alphabetically(ascending) {

  return function (a, b) {

    if (a === b) {
        return 0;
    }
    else if (a === null) {
        return 1;
    }
    else if (b === null) {
        return -1;
    }
    else if (ascending) {
        return a < b ? -1 : 1;
    }
    else if (!ascending) {
        return a < b ? 1 : -1;
    }

  };

}

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

console.log(arr.sort(alphabetically(true)));
console.log(arr.sort(alphabetically(false)));

Ответ 2

Используйте функцию пользовательского сравнения, которая отличает значения null:

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

В порядке убывания просто поменяйте a и b на прямое сравнение:

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

Ответ 3

Самый простой способ - сначала обработать 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]

Ответ 4

как это, обратите внимание: это будет только толкать нуль в обратную сторону

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

    if (el === null) {
        arrSor.push(el);
    } else {
        arrSor.unshift(el);
    }
});

Ответ 5

Сделайте это как:

        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;