我正在尝试对包含空字符串,数字,“无限”,“ - 无限”和“NaN”的数组进行排序。我以字符串的形式接收所有值,因此当涉及空字符串,inf和nan时,sort不能按预期工作。有没有办法按升序和降序自定义排序功能?
答案 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
数组。
另请注意NaN
和Infinity
(不是字符串文字)也是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);