如何比较字符串和数字值(尊重负值,null总是持续)?

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]

thg*_*ell 7

您应首先检查是否有值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)

这样您就可以按实例级别进行排序.


http://jsfiddle.net/gxFGN/10/

JavaScript的

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)

  • 这不起作用.你没有返回`0`如果两个操作数都是`null`,甚至更糟*抛出一个异常`a.localeCompare不是*进行比较时,`10`与`"酒吧"`一个function` - 小提琴被打破(与Opera排序算法一起发生) (2认同)