2015-04-23 4 views
16

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

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)?

+0

_ «его не совсем то, что мне нужно» _ больше информации, пожалуйста. –

+0

Используйте свою собственную функцию сортировки a la http://stackoverflow.com/q/8537602/438992, которая всегда возвращает больше, чем для нулей. –

ответ

36

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

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

var alphabetically = function(ascending){ 

    return function(a,b){ 

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

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

Не забывайте случай 'a === null'! – Bergi

+1

Мне пришлось переместить 'a === b' в исходное условие if, иначе null/null не был возвращен как равный. – Sako73

+0

Может ли кто-нибудь объяснить, почему мы отправляем 1 для a и -1 для b? if (a === null) { return 1; } else if (b === null) { return -1; } – prgmrDev

14

Используйте пользовательские функции сравнения, что discrimiates против 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); 
}); 
+0

@downvoter, пожалуйста, объясните, что не хватает? – Bergi

+0

Используется для отправки пустых дат в нижней части списка при сортировке дат в порядке возрастания. Великолепное решение, спасибо вам! – mhodges

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]

0

как это, обратите внимание: это будет толкать только нуль, чтобы задняя

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

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

ли это нравится:

 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; 
Смежные вопросы