Comment trier un tableau multi dimensionnel par plusieurs colonnes en JavaScript?

J'ai travaillé sur ce problème toute la journée sans une bonne solution. Google a été de peu d'aide. J'ai un script qui doit accepter un tableau à deux dimensions avec un nombre inconnu nombre de lignes/colonnes. Le script doit également accepter un dimensions tableau contenant une liste de colonnes à trier, et l'autre contenant l'ordre de tri. L'appel ressemble un peu à ceci:

var orderList = {0,4,3,1};
var orderDir = {asc,desc,desc,asc};
dataArr = do2DArraySort(dataArr, orderList, orderDir);

La fonction do2DArraySort doit retourner le dataArr tableau trié par la première colonne (en ordre croissant), puis par le cinquième (en ordre décroissant), puis par le troisième (en ordre décroissant), puis par le deuxième (en ordre décroissant). J'ai été capable de le faire à deux niveaux de profondeur à l'aide du code ci-dessous, mais il est tombé à part une fois que j'ai essayé d'ajouter une troisième colonne de tri. Je comprends pourquoi, mais je ne peux pas trouver un bon moyen de le faire fonctionner.

Est-il un moyen standard de le faire? Quelqu'un pourrait-il m'indiquer un bon script en ligne je peux étude et l'utiliser comme un modèle? Ou quelqu'un peut-il suggérer une modification à mon code pour le faire fonctionner?

Merci!

//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;
}

OriginalL'auteur Nicholas | 2011-05-23