He estado trabajando en este problema todo el día sin una buena solución. Google también ha sido de poca ayuda. Tengo un script que necesita aceptar una matriz bidimensional con un número desconocido de filas/columnas. La secuencia de comandos también debe aceptar una matriz unidimensional que contenga una lista de columnas para ordenar, y otra que contenga el orden para ordenar por. La llamada se verá un poco como esto:¿Cómo se puede ordenar una matriz multidimensional por varias columnas en JavaScript?
var orderList = {0,4,3,1};
var orderDir = {asc,desc,desc,asc};
dataArr = do2DArraySort(dataArr, orderList, orderDir);
La función do2DArraySort debe devolver la matriz dataArr ordenados por la primera columna (en orden ascendente), luego por la quinta (en orden descendente), y luego por la tercera (en orden descendente), luego por el segundo (en orden descendente). Pude hacer dos niveles de profundidad utilizando el siguiente código, pero se vino abajo una vez que intenté agregar una tercera columna de clasificación. Entiendo por qué, pero no puedo encontrar una buena manera de hacerlo funcionar.
¿Hay una forma estándar de hacer esto? ¿Podría alguien señalarme un buen script en línea que pueda estudiar y usar como plantilla? ¿O alguien puede sugerir una modificación a mi código para que funcione?
Gracias!
//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;
}
Gracias; esto es fantástico y muy esclarecedor Voy a investigar un poco más ahora. Parece que funciona de maravilla suponiendo que todos los elementos son numéricos, pero como mi matriz podría contener una combinación de números, fechas, caracteres, etc., tendré que encontrar la forma de modificar la función dentro del género para determinar el tipo de campo y ordenar en consecuencia . ¿Conoces un buen recurso al que podrías dirigirme para esto? – Nicholas
@Nicholas: Incluí un ejemplo para ordenar las fechas del objeto 'Fecha' y las cadenas. Si comprende el uso de matrices y sabe un poco de Javascript, puede ordenar todo, siempre que tenga los requisitos para el algoritmo de clasificación. Si no está claro, agregue un comentario que pueda ser explicado. – Lekensteyn
Lekensteyn; una vez más, gracias. Creo que entiendo bastante bien (ser peligroso) ahora;). Descubrí que el algoritmo básico de clasificación parece funcionar bien en las fechas sin tener que usar el método getTime. ¿Me estoy perdiendo algún error al omitir eso? Eres un verdadero salvavidas. :) – Nicholas