leb*_*olo 7 javascript sorting
我正在尝试对值数组进行排序,这些值可以是数值或字符串值的混合(例如[10,"20",null,"1","bar","-2",-3,null,5,"foo"]).我怎样才能对这个数组进行排序
null 值总是放在最后(无论排序顺序如何,请参阅jsFiddle)?我用一个详细的数字和字符串示例(使用和选项)制作了一个jsFiddle,但是会将我的排序算法的数字版本粘贴到下面作为起点.localeComparenumeric
// Sorting order
var order = "asc"; // Try switching between "asc" and "dsc"
// Dummy arrays
var numericArr = [10,20,null,1,-2,-3,null,5];
// Sort arrays
$(".output1").append(numericArr.toString());
numericArr.sort(sortByDataNumeric);
$(".output2").append(numericArr.toString());
// Numeric sorting function
function sortByDataNumeric(a, b, _order) {
// Replace internal parameters if not used
if (_order == null) _order = order;
// If values are null, place them at the end
var dflt = (_order == "asc" ? Number.MAX_VALUE : -Number.MAX_VALUE);
// Numeric values
var aVal = (a == null ? dflt : a);
var bVal = (b == null ? dflt : b);
return _order == "asc" ? (aVal - bVal) : (bVal - aVal);
}
Run Code Online (Sandbox Code Playgroud)
我的字符串排序算法(参见jsFiddle)的问题在于我找不到一种方法来始终将null值放在最后并且负值未在其自身内正确排序(例如-3应小于-2)
为了回答这些评论,我希望[10,"20",null,"1","bar","-2",-3,null,5,"foo"]能够这样做[-3,"-2","1",5,10,"20","bar","foo",null,null]
您应首先检查是否有值null并返回相反的值.
在旁注:
对于默认_order值,您应该检查参数是否undefined而不是将其值与之比较null.如果您尝试直接比较未定义的内容,则会出现引用错误:
(undefinedVar == null) // ReferenceError: undefinedVar is not defined
Run Code Online (Sandbox Code Playgroud)
相反,您应该检查变量是否未定义:
(typeof undefinedVar == "undefined") // true
Run Code Online (Sandbox Code Playgroud)
此外,将compare函数包装在闭包中而不是依赖于全局顺序变量可能更好.
有时像:
[].sort(function(a, b){ return sort(a, b, order)})
Run Code Online (Sandbox Code Playgroud)
这样您就可以按实例级别进行排序.
function sort(a, b, asc) {
var result;
/* Default ascending order */
if (typeof asc == "undefined") asc = true;
if (a === null) return 1;
if (b === null) return -1;
if (a === null && b === null) return 0;
result = a - b;
if (isNaN(result)) {
return (asc) ? a.toString().localeCompare(b) : b.toString().localeCompare(a);
}
else {
return (asc) ? result : -result;
}
}
Run Code Online (Sandbox Code Playgroud)