我一直在解決這個問題,整天沒有一個好的解決方案。 Google也沒什麼幫助。我有一個腳本,需要接受具有未知數量的行/列的二維數組。該腳本還需要接受包含要排序的列的列表的一維數組,以及包含要排序的順序的另一個數組。此次電話會議將看起來有點像這樣:如何在JavaScript中通過多列對多維數組進行排序?
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;
}
謝謝;這太棒了,非常有啓發性。我現在要做一些進一步的研究。它看起來像這個偉大的假設所有元素都是數字,但由於我的數組可能包含數字,日期,字符等的混合,我需要弄清楚如何修改排序內的函數來確定字段類型並進行相應的排序。你碰巧知道一個很好的資源,你可以指點我嗎? – Nicholas 2011-05-23 19:30:21
@Nicholas:我包含了一個例子,用於對日期對象和字符串進行排序。如果你理解數組的用法並且知道一些Javascript,你可以對所有提供排序算法的需求進行排序。如果不清楚,可以添加一條評論來解釋。 – Lekensteyn 2011-05-23 20:40:04
Lekensteyn;再次謝謝你。我覺得我現在對自己的理解已經夠好了(很危險);)。我發現基本的排序算法似乎在日期中工作得很好,而不必使用getTime方法。我是否錯過了跳過這些的缺陷?你是一個真正的救星。 :) – Nicholas 2011-05-24 15:03:05