我一整天都在解决这个问题,但是没有好的解决方案。 Google也没有提供太多帮助。 我有一个脚本需要接收一个未知行列数的二维数组,并且还需要接受一个包含要排序的列的一维数组,以及另一个包含按什么顺序排序的数组。 调用将类似于这样:
var orderList = {0,4,3,1};
var orderDir = {asc,desc,desc,asc};
dataArr = do2DArraySort(dataArr, orderList, orderDir);
函数 do2DArraySort 应该按照第一列(升序)、第五列(降序)、第三列(降序)、第二列(降序)的顺序返回已排序的 dataArr 数组。我已经使用下面的代码实现了两级深度,但是当我尝试添加第三个排序列时,它就崩溃了。我理解为什么会这样,但是我无法想出一个好的方法使其正常工作。是否有标准的做法?能否指点一个好的在线脚本供我学习并用作模板?或者能否建议一种修改我的代码的方法使其正常工作?
谢谢!
//appends an array content to the original array
function addToArray(originalArray, addArray) {
if (addArray.length != 0) {
var curLength = 0;
curLength = originalArray.length;
var maxLength = 0;
maxLength = curLength + addArray.length;
var itrerateArray = 0;
for (var r = curLength; r < maxLength; r++) {
originalArray[r] = addArray[itrerateArray];
itrerateArray++;
}
}
}
function do2DArraySort(arrayToBeSorted, sortColumnArray, sortDirectionArray) {
if (arrayToBeSorted == "undefined" || arrayToBeSorted == "null") return arrayToBeSorted;
if (arrayToBeSorted.length == 0) return arrayToBeSorted;
if (sortColumnArray.length == 0) return arrayToBeSorted;
tempArray = arrayToBeSorted;
var totalLength = sortColumnArray.length;
for(var m = 0; m < totalLength; m++) {
if (m == 0) {
doBubbleSort(tempArray, tempArray.length, sortColumnArray[m], sortDirectionArray[m]);
} else {
doMultipleSort(tempArray, sortColumnArray[m], sortColumnArray[m-1], sortDirectionArray[m]);
}
}
return tempArray;
}
//check if a value exists in a single dimensional array
function checkIfExists(arrayToSearch, valueToSearch) {
if (arrayToSearch == "undefined" || arrayToSearch == "null") return false;
if (arrayToSearch.length == 0) return false;
for (var k = 0; k < arrayToSearch.length; k++) {
if (arrayToSearch[k] == valueToSearch) return true;
}
return false;
}
//sorts an 2D array based on the distinct values of the previous column
function doMultipleSort(sortedArray, currentCol, prevCol, sortDirection) {
var resultArray = new Array();
var newdistinctValuesArray = new Array();
//finding distinct previous column values
for (var n = 0; n < sortedArray.length; n++) {
if (checkIfExists(newdistinctValuesArray, sortedArray[n][prevCol]) == false) newdistinctValuesArray.push(sortedArray[n][prevCol]);
}
var recCursor = 0;
var newTempArray = new Array(); var toStoreArray = 0;
//for each of the distinct values
for (var x = 0; x < newdistinctValuesArray.length; x++) {
toStoreArray = 0;
newTempArray = new Array();
//find the rows with the same previous column value
for (var y = 0; y < sortedArray.length; y++) {
if (sortedArray[y][prevCol] == newdistinctValuesArray[x]) {
newTempArray[toStoreArray] = sortedArray[y];
toStoreArray++;
}
} //sort the row based on the current column
doBubbleSort(newTempArray, newTempArray.length, currentCol, sortDirection);
//append it to the result array
addToArray(resultArray, newTempArray);
}
tempArray = resultArray;
}
Date
对象和字符串进行排序的示例。如果你理解数组的使用并且了解一些Javascript,你可以对所有内容进行排序,只要你有排序算法的要求。如果不清楚,请添加评论以便解释。 - Lekensteyn(new Date("Thu, 21 Dec 2000 16:01:07 +0200")).getTime()
。对于大型数组,最好缓存结果,并使用缓存结果进行比较。 - Lekensteyn