Tengo una matriz multidimensional. La matriz primaria es una matriz de
[publicationID][publication_name][ownderID][owner_name]
Lo que estoy tratando de hacer es ordenar la matriz por owner_name
y luego por publication_name
. Sé que en JavaScript tienes Array.sort()
, en el que puedes poner una función personalizada, en mi caso tengo:
function mysortfunction(a, b) {
var x = a[3].toLowerCase();
var y = b[3].toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
Esto está bien solo para ordenar en una columna, a saber, owner_name, pero ¿cómo lo modifico para ordenar owner_name
, entonces publication_name
?
javascript
algorithm
sorting
flavour404
fuente
fuente
[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Creo que lo que estás buscando es thenBy.js: https://github.com/Teun/thenBy.js
Te permite usar el Array.sort estándar, pero con
firstBy().thenBy().thenBy()
estilo.Aquí se puede ver un ejemplo .
fuente
thenBy
se llama, todos los elementos de la matriz se repiten.Una buena forma de ordenar en muchos campos que son cadenas es usar
toLocaleCompare
y el operador booleano||
.Algo como:
Si desea ordenar en más campos, simplemente puede encadenarlos fuera de la declaración de retorno con más operadores booleanos.
fuente
.reduce()
.localCompare()
devuelve -1, 0, 1 así que no creo que tu solución funcione como || es bueno para los booleanossortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name);
y funciona de maravilla para mis necesidades no exigentes.(a.name - b.name)
menos que sea necesario. La creación de variables primero hace un trabajo adicional incluso si no es necesario.Encontré la necesidad de hacer ordenaciones de matriz de objetos asc y desc mixtas al estilo SQL por claves.
La solución de Kennebec anterior me ayudó a llegar a esto:
uso de muestra:
produce lo siguiente:
(usando una función de impresión desde aquí )
aquí hay un ejemplo de jsbin .
editar: limpiado y publicado como mksort.js en github .
fuente
Esto es útil para tipos alfa de todos los tamaños. Páselo los índices por los que desea ordenar, en orden, como argumentos.
fuente
Sugiero utilizar un comparador integrado y encadenar el orden de clasificación deseado con o lógico
||
.Ejemplo de trabajo:
fuente
Puede combinar las 2 variables en una clave de clasificación y usarla para su comparación.
fuente
Encontré multisotr . Esta es una biblioteca simple, potente y pequeña para clasificación múltiple. Necesitaba ordenar una serie de objetos con criterios de clasificación dinámica:
Esta biblioteca más poderosa, ese fue mi caso. Intentalo.
fuente
Estaba trabajando
ng-grid
y necesitaba ordenar varias columnas en una matriz de registros devueltos desde una API, así que se me ocurrió esta función ingeniosa y dinámica de ordenación múltiple.En primer lugar,
ng-grid
dispara un "evento" para "ngGridSorted" y devuelve esta estructura, describiendo el tipo:Así que construí una función que generará dinámicamente una función de clasificación basada en
sortData
como se muestra arriba (¡ No te asustes por la barra de desplazamiento! ¡Tiene solo 50 líneas de largo! Además, lamento la pendiente. Evitó una barra de desplazamiento! ):Luego ordeno los resultados de mi API (
results
) así:¡Espero que alguien más disfrute de esta solución tanto como yo! ¡Gracias!
fuente
Prueba esto:
Mostrar fragmento de código
Supongo que sus datos en la matriz
let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]
donde el índice de owner_name = 3 y publishing_name = 1.fuente
Método de adición de cadena
Puede ordenar por múltiples valores simplemente agregando los valores en una cadena y comparando las cadenas. Es útil agregar un carácter de tecla dividida para evitar el escurrimiento de una tecla a la siguiente.
Ejemplo
fuente
fuente
Tuve un problema similar al mostrar bloques de grupo de memoria de la salida de alguna composición de funciones h de DOM virtual. Básicamente, me enfrenté al mismo problema al ordenar datos de varios criterios, como los resultados de puntuación de jugadores de todo el mundo.
He notado que la clasificación de criterios múltiples es:
Y si no te importa, podrías fallar rápidamente en un infierno anidado ... como un infierno de promesas de devolución de llamada ...
¿Qué pasa si escribimos una función de "predicado" para decidir qué parte del uso alternativo? El predicado es simplemente:
Ahora, después de haber escrito sus pruebas de clasificación (byCountrySize, byAge, byGameType, byScore, byLevel ...) lo que sea que necesite, puede ponderar sus pruebas (1 = asc, -1 = desc, 0 = deshabilitar), ponerlas en una matriz , y aplique una función de 'decidir' reductora como esta:
Y voilá ! Depende de usted definir sus propios criterios / pesos / órdenes ... pero ya entiende la idea. Espero que esto ayude !
EDITAR: * asegúrese de que haya un orden de clasificación total en cada columna * tenga en cuenta que no hay dependencias entre los órdenes de las columnas y no dependencias circulares
si no, la clasificación puede ser inestable.
fuente
Mi propia biblioteca para trabajar con iterables de ES6 (blinq) permite (entre otras cosas) una clasificación fácil en varios niveles
fuente
Obtenido de GitHub
fuente
Acabo de publicar en npm una microbiblioteca llamada sort-helper ( fuente en github ) . La idea es importar el ayudante
by
para crear la función de comparación para elsort
método de matriz a través de la sintaxisitems.sort(by(column, ...otherColumns))
, con varias formas de expresar las columnas para ordenar:persons.sort(by('lastName', 'firstName'))
,dates.sort(by(x => x.toISOString()))
,[3, 2, 4, 1].sort(by(desc(n => n)))
→[3, 2, 1, 0]
,['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')
→'aBcD'
.Es similar al nice thenBy mencionado en esta respuesta, pero con las siguientes diferencias que pueden ser más del gusto de algunos:
thenBy
API fluida) ,fuente