¿Es posible ordenar y reorganizar una matriz que se ve así:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
para que coincida con la disposición de esta matriz:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
Desafortunadamente, no tengo ninguna identificación para seguir. Necesitaría priorizar la matriz de elementos para que coincida con el sortingArr lo más cerca posible.
Actualizar:
Aquí está la salida que estoy buscando:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
¿Alguna idea de cómo se puede hacer esto?
javascript
usuario1448892
fuente
fuente
Respuestas:
Algo como:
Aquí hay un código más corto, pero destruye la
sorting
matriz:fuente
Una línea de respuesta.
fuente
itemsArray
. Dependiendo del requisito de rendimiento, sería mucho más seguro hacerloitemsArray.slice().sort(...)
.sortingArr
contener todos los valoresitemsArray
. La solución es empujar los elementos hacia la parte posterior de la matriz si no existen ensortingArr
:allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });
Si usa la función de ordenación de matriz nativa, puede pasar un comparador personalizado para usar al ordenar la matriz. El comparador debe devolver un número negativo si el primer valor es menor que el segundo, cero si son iguales y un número positivo si el primer valor es mayor.
Entonces, si entiendo el ejemplo que está dando correctamente, podría hacer algo como:
fuente
indexOf
devuelve el primer índice.sortingArr
son únicos - que, afortunadamente, son en mi caso :)sortingArray
exterior de la función para evitar volver a declararla en cada iteración de clasificaciónCaso 1: Pregunta original (sin bibliotecas)
Muchas otras respuestas que funcionan. :)
Caso 2: Pregunta original (Lodash.js o Underscore.js)
Caso 3: Ordenar Array1 como si fuera Array2
Supongo que la mayoría de las personas vinieron aquí buscando un equivalente al array_multisort de PHP (lo hice), así que pensé en publicar esa respuesta también. Hay un par de opciones:
1. Existe una implementación JS existente de array_multisort () . Gracias a @Adnan por señalarlo en los comentarios. Sin embargo, es bastante grande.
2. Escribe el tuyo. ( Demostración JSFiddle )
3. Lodash.js o Underscore.js (ambas bibliotecas populares y más pequeñas que se centran en el rendimiento) ofrecen funciones auxiliares que le permiten hacer esto:
... que (1) agrupará el sortArray en
[index, value]
pares, (2) los ordenará por el valor (también puede proporcionar una devolución de llamada aquí), (3) reemplazará cada uno de los pares con el elemento del itemArray en el índice par originario de.fuente
Probablemente sea demasiado tarde, pero también puede usar alguna versión modificada del código siguiente en estilo ES6. Este código es para matrices como:
La operación real:
La operación real en ES5:
Debería resultar en
arrayToBeSorted = [3,5]
No destruye la matriz de referencia.
fuente
[{name: "1"}, {name: "2"}, {name: "3"}, ...]
.Usaría un objeto intermediario (
itemsMap
), evitando así la complejidad cuadrática:Ver http://jsfiddle.net/eUskE/
fuente
http://jsfiddle.net/s7b2P/
Orden resultante: Bob, Jason, Henry, Thomas, Anne, Andrew
fuente
¿Por qué no algo como
La función de mapa puede no estar disponible en todas las versiones de
Javascript
fuente
fuente
Esto es lo que estaba buscando e hice para ordenar una matriz de matrices basada en otra matriz:
fuente
Tuve que hacer esto para una carga JSON que recibo de una API, pero no estaba en el orden que quería.
Matriz para ser la matriz de referencia, la que desea ordenar la segunda matriz:
Hice estos como objetos porque eventualmente tendrán otras propiedades.
Matriz creada:
Lo usé con el conjunto de resultados de la base de datos. No sé qué tan eficiente es, pero con la poca cantidad de columnas que utilicé, funcionó bien.
fuente
Para obtener una nueva matriz ordenada, puede tomar
Map
y recolectar todos los elementos con la clave deseada en una matriz y asignar las claves ordenadas deseadas tomando el elemento tamizado del grupo deseado.fuente
{}
lugar deMap
🤷♂️Esta solución agregará los objetos al final si la clave de clasificación no está presente en la matriz de referencia
fuente
Esto debería funcionar:
fuente
Podrías probar este método.
fuente
ES6
Más ejemplos con diferentes matrices de entrada.
fuente
En caso de que llegue aquí necesitando hacer esto con una variedad de objetos, aquí hay una adaptación de la increíble respuesta de @Durgpal Singh:
fuente
Use el método $ .inArray () de jQuery. Entonces podrías hacer algo como esto
fuente
Use la intersección de dos matrices.
Ex:
=> ['a', 'b', 'e']
si 'z y' s 'están fuera del rango de la primera matriz, agréguela al final del resultado
fuente
Puedes hacer algo como esto:
Puedes probarlo aquí .
Nota: esto supone que las matrices que pasa son de tamaño equivalente, necesitaría agregar algunas verificaciones adicionales si este no fuera el caso.
enlace de referencia
referir
fuente