如何使用空字符串,NaN,数字和无穷大对数组进行排序

时间:2016-11-04 18:33:49

标签: javascript arrays sorting

我正在尝试对包含空字符串,数字,“无限”,“ - 无限”和“NaN”的数组进行排序。我以字符串的形式接收所有值,因此当涉及空字符串,inf和nan时,sort不能按预期工作。有没有办法按升序和降序自定义排序功能?

2 个答案:

答案 0 :(得分:1)

您可以使用对象作为排序顺序,并将给定的项目移动到所需位置。

var array = ["", 2, 3, 0, "inf", "-inf", "Nan", -1, -100000];

array.sort(function (a, b) {
    var order = { "": -4, "-inf": -3, "Nan": -2, "inf": -1 };
    return (order[a] || 0) - (order[b] || 0) || a - b;
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

修改:根据您的评论"" < "-inf" < "Nan" < "inf" < ... < -1 < 0 < 1 < ...。您可以通过修改order数组来更改此设置。

请注意,如果数组包含order数组中不存在的元素,则此代码将无法正常工作。您可以为此设置保护,或者将其他特殊元素(如0)添加到order数组。

另请注意NaNInfinity(不是字符串文字)也是javascript中的数字。使用此代码,它们将在数字旁边订购。

var basicCompare = function (a, b) {
    if (a > b) return 1;
    if (a < b) return -1;
    return 0;
}

var compare = function (a, b) {
    // 0 represents numbers.
    var order = ["", "-inf", "Nan", "inf", 0],
        orderOfNumber = order.indexOf(0),   
        orderOfA = typeof(a) === "number" ? orderOfNumber : order.indexOf(a),
        orderOfB = typeof(b) === "number" ? orderOfNumber : order.indexOf(b);

    if (orderOfA === orderOfNumber & orderOfB === orderOfNumber) {
        // They are both numbers, use regular comparison.
        return basicCompare(a, b);
    }

    // They are not both numbers, so use the axiomatic order.
    return basicCompare(orderOfA, orderOfB)
}

array.sort(compare);