2010-05-08 5 views
7

Tengo una matriz con matrices en ella, donde quiero ordenar las matrices externas en función de los valores en una columna específica en el interior.sort matriz externa basada en valores en la matriz interna, javascript

Apuesto a que sonaba más que un poco confuso, así que voy directamente a un ejemplo.

datos inicial:

var data = [ 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

Ordenar datos, sobre la base de la columna con índice 1

data.sortFuncOfSomeKind(1); 

donde el objeto a continuación, se vería así;

var data = [ 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

Ordenar datos, basados ​​en columna con índice 2

data.sortFuncOfSomeKind(2); 

donde el objeto a continuación, se vería así;

var data = [ 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ] 
]; 

La gran Q

¿Hay una solución existente a este que se sabe de ella o tengo que escribir uno yo mismo? Si es así, ¿cuál sería el algoritmo de ordenación más fácil de usar? ¿Ordenación rápida?

_L

+2

posible duplicado de [objetos de clasificación en una matriz por un valor de campo en JavaScript] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array- by-a-field-value- in-javascript), [Javascript: ¿Cómo ordenar una matriz de registros por valores en uno de los campos?] (http://stackoverflow.com/questions/1689679/javascript-how-to-sort-an-array-of -records-by-values-in-one-of-the-fields) – outis

Respuesta

8

Array#sort (ver sección 15.4.4.11 de the spec, o , o MDC) acepta un parámetro de función opcional que se utilizará para comparar dos entradas para fines de clasificación. La función debe devolver -1 si el primer argumento es "menor que" el segundo, 0 si son iguales o 1 si el primero es "mayor que" el segundo. Por lo tanto:

outerArray.sort(function(a, b) { 
    var valueA, valueB; 

    valueA = a[1]; // Where 1 is your index, from your example 
    valueB = b[1]; 
    if (valueA < valueB) { 
     return -1; 
    } 
    else if (valueA > valueB) { 
     return 1; 
    } 
    return 0; 
}); 

(es obvio que puede comprimir el código un poco, me he mantenido detallado para mayor claridad.)

1

Aquí solía ser una aplicación tipo que devuelve el resultado de una simple comparación x<y. Esta solución no se fomenta y esta publicación se deja solo para preservar la discusión posterior.

+0

D'oh. No sabía que solo podía devolver x [a]> y [a] para un valor de comparación como ese. Eso me ahorrará algunas líneas de código. – awgy

+0

@David: Estás devolviendo 'true' o' false'. Debe devolver -1, 0 o 1. (Lo comprobé, en caso de que faltara algo realmente increíble, pero lo anterior no se puede clasificar correctamente en todos los casos). –

+0

@awgy: No puede: http: // pastie.org/951302 –

4

Aquí es una solución que no necesita una variable separada para contener el índice

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

Este tipo sobre el índice 2

+1

Debe cambiar esa '=' por '==='. Las comparaciones no les gusta ser confundidas con asignaciones. – awgy

+0

Bueno, cámbialo a '==' o '===' según tus necesidades. –

+0

sí, un pequeño error allí - corregido ahora –

Cuestiones relacionadas