Сортируйте массив так, чтобы нулевые значения всегда приходили последним
Мне нужно отсортировать массив строк, но мне это нужно, чтобы нуль всегда был последним. Например, массив:
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;