所以我有一个只包含字符串的数组。 数组数组将显示为一个表,并且可能包含超过1000行,每行包含20个或更多值。
例如:
var arr = [
["bob","12","yes"],
["joe","","no"],
["tim","19","no"],
["dan","","yes"],
["tim","",""],
["dan","0",""]
]
字符串可能包含任何可以表示为字符串的内容,包括:" "
,""
,"0"
或"00-00-00"
等...以及我的任何列用于订购。
我正在对数组进行升序和降序排序,但我排序的一些值是空字符串:""
。在所有现代浏览器中,如何才能使空字符串(仅)始终位于新数组的末尾?
目前他们在上升时结束,但在下降时开始。
我正在排序如下(是的,我确信我也可以做得更短):
if (direction == "asc") {
SortedArr = arr.sort(function (a, b) {
if (a[colToSortBy] == '') {
return -1;
}
if (a[colToSortBy].toUpperCase() < b[colToSortBy].toUpperCase()) {
return -1;
}
if (a[colToSortBy].toUpperCase() > b[colToSortBy].toUpperCase()) {
return 1;
}
return 0;
});
} else {
SortedArr = arr.sort(function (a, b) {
if (a[colToSortBy] == '') {
return -1;
}
if (b[colToSortBy].toUpperCase() < a[colToSortBy].toUpperCase()) {
return -1;
}
if (b[colToSortBy].toUpperCase() > a[colToSortBy].toUpperCase()) {
return 1;
}
return 0;
});
}
答案 0 :(得分:5)
Working example无论顺序是升序还是降序,总是将空字符串放在最后。这可能是一个可用性问题,但这是解决方案:
if (direction == "asc") {
SortedArr = arr.sort(function (a, b) {
return (a[col] || "|||").toUpperCase().localeCompare((b[col] || "|||").toUpperCase())
});
} else {
SortedArr = arr.sort(function (a, b) {
return (b[col] || "!!!").toUpperCase().localeCompare((a[col] || "!!!").toUpperCase())
});
}
答案 1 :(得分:0)
我认为您的问题来自于您正在检查a[colToSortBy]
是否是一个emtpy字符串但您没有为b[colToSortBy]
执行此操作。
答案 2 :(得分:0)
我正在编写一个必须适用于IE,FF,Safari,Chrome,Opera,桌面,平板电脑(包括iPad)的应用程序。手机(包括iPhone)。这意味着我会继续跨浏览器进行测试因此,我发现下面的我的排序程序在FF中没有正常工作,直到我添加了新的部分&#39;部分代码。原因是我没有在没有提供数值时进行排序(破折号, - )。 FF也没有正负值( - )值。此代码现在可以完美地运行:
if (SortByID == 0) { //string values (Bank Name)
myValues.sort( function (a,b) {
var nameA = a[SortByID].toUpperCase(), nameB = b[SortByID].toUpperCase();
if (SortOrderID == 1) { //sort string ascending
if (nameA < nameB) { return -1; } else { if (nameA > nameB) { return 1; } }
} else { //sort string descending
if (nameA < nameB) { return 1; } else { if (nameA > nameB) { return -1; } }
}
return 0 //default return value (no sorting)
})
} else { //numeric values (Items)
myValues.sort(function (a, b) {
if (isNumber(a[SortByID]) && isNumber(b[SortByID])) { //
if (SortOrderID == 1) { //sort number ascending
return parseFloat(a[SortByID]) - parseFloat(b[SortByID]);
} else { //sort string descending
return parseFloat(b[SortByID]) - parseFloat(a[SortByID]);
}
} else { //one of the values is not numeric
//new section
if (!isNumber(a[SortByID])) {
if (SortOrderID == 1) { //sort number ascending
return -1;
} else { //sort number descending
return 1;
}
} else {
if (!isNumber(b[SortByID])) {
if (SortOrderID == 1) { //sort number ascending
return 1;
} else { //sort number descending
return -1;
}
}
}//New section
return 0;
}
})
}
我知道它很长,但这对我来说很容易理解。我希望它也能解决Chris J.提出的浏览器问题。 * isNumber是一个简单的函数,测试值是否为!isNAN
答案 3 :(得分:0)
我在我的应用程序中使用了这种方式...
你可以调整它以获得有利的结果。 我们还有Number.MAX_SAFE_INTEGER
var arr = [10, "", 8, "", 89, 72]
var min = Number.MIN_SAFE_INTEGER
var sorted = arr.sort(function (a,b) {
return (a || min) - (b || min)
})
var cons = document.getElementById("console")
cons.innerText = "Ascending " + JSON.stringify(sorted) + "\n" + "Descending " + JSON.stringify(sorted.reverse())
&#13;
<html>
<head></head>
<body>
<p id="console"></p>
</body>
</html>
&#13;