Tengo una matriz de objetos con varios pares de valores clave, y necesito ordenarlos según 'updated_at':
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
¿Cuál es la forma más eficiente de hacerlo?
javascript
arrays
object
monstruo de galletas
fuente
fuente
Respuestas:
Puedes usar
Array.sort
.Aquí hay un ejemplo:
fuente
keyA - keyB
(o posiblementekeyB - keyA
)? Los objetos de fecha tienen unvalueOf()
método.a-b
es realmente importante si desea evitar el código largo. Si bien el código largo no es necesariamente malo en este caso, creo que la verbosidad hace que sea más difícil de entender. Actualmente usovalues.sort((a,b)=>a.attr-b.attr)
. Tener que escribir 5 líneas cada vez que necesita ordenar una matriz se vuelve tedioso.Ya respondí una pregunta muy similar aquí: función simple para ordenar una matriz de objetos
Para esa pregunta, creé esta pequeña función que podría hacer lo que quieras:
fuente
-1
:)array = array.reverse()
función.El método Array.sort () ordena los elementos de una matriz en su lugar y devuelve la matriz. Tenga cuidado con Array.sort () ya que no es inmutable . Para una ordenación inmutable, use immutable-sort .
Este método consiste en ordenar la matriz usando su actual
updated_at
en formato ISO. Utilizamosnew Data(iso_string).getTime()
para convertir el tiempo ISO a la marca de tiempo de Unix. Una marca de tiempo Unix es un número en el que podemos hacer cálculos matemáticos simples. Restamos la primera y segunda marca de tiempo que es el resultado; Si la primera marca de tiempo es mayor que la segunda, el número de retorno será positivo. Si el segundo número es mayor que el primero, el valor de retorno será negativo. Si los dos son iguales, el rendimiento será cero. Esto se alinea perfectamente con los valores de retorno requeridos para la función en línea.Para ES6 :
Para ES5 :
Si cambia su
updated_at
marca de tiempo de Unix, puede hacer esto:Para ES6 :
Para ES5 :
En el momento de esta publicación, los navegadores modernos no son compatibles con ES6. Para usar ES6 en navegadores modernos, use babel para transpilar el código a ES5. Espere soporte de navegador para ES6 en un futuro próximo.
Array.sort () debería recuperar un valor de retorno de uno de los 3 resultados posibles:
Para el tipo inmutable: (ejemplo en ES6)
También puedes escribirlo de esta manera:
La importación desde que ve es una nueva forma de incluir JavaScript en ES6 y hace que su código se vea muy limpio. Mi favorito personal
La ordenación inmutable no muta la matriz de origen, sino que devuelve una nueva matriz. El uso
const
se recomienda en los datos inmutable.fuente
Aquí hay una versión ligeramente modificada de la respuesta de @David Brainer-Bankers que se ordena alfabéticamente por cadena, o numéricamente por número, y asegura que las palabras que comienzan con mayúsculas no se ordenan por encima de las palabras que comienzan con una letra minúscula (por ejemplo, "manzana, temprano" se mostrará en ese orden).
fuente
Utilice subrayado js o lodash,
_.sortBy()
devuelve una nueva matrizconsulte http://underscorejs.org/#sortBy y lodash docs https://lodash.com/docs#sortBy
fuente
Con el soporte de ES2015 se puede hacer:
fuente
new Date(iso_str).getTime()
esto devolverá una marca de tiempo Unix.Datos importados
PARA orden ascendente
Ejemplo de orden de Asc
PARA orden descendente
Ejemplo de orden Desc
fuente
Como dice esta respuesta, puede usar
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
fuente
Solo otra forma más matemática de hacer lo mismo pero más corta :
o en el elegante estilo de flecha lambda:
Este método se puede hacer con cualquier entrada numérica
fuente
En cuanto a hoy, las respuestas de @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) y @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) se pueden combinar para proporcionar soporte para ES2015 y manejo correcto de la fecha:
fuente
He creado una función de clasificación en Typecript que podemos usar para buscar cadenas, fechas y números en una matriz de objetos. También puede ordenar en múltiples campos.
Uso:
fuente
Ordenar por una fecha con formato ISO puede ser costoso, a menos que limite los clientes a los navegadores más recientes y mejores, que pueden crear la marca de tiempo correcta al analizar la cadena.
Si está seguro de su entrada y sabe que siempre será aaaa-mm-ddThh: mm: ss y GMT (Z), puede extraer los dígitos de cada miembro y compararlos como enteros
Si la fecha se puede formatear de manera diferente, es posible que deba agregar algo para las personas con problemas de iso:
fuente
Date.parse
?Para completar, aquí hay una posible implementación genérica corta de sortBy:
Tenga en cuenta que esto utiliza el método de ordenación de matrices que se ordena en su lugar. para una copia, puede usar arr.concat () o arr.slice (0) o un método similar para crear una copia.
fuente
Con esto podemos pasar una función clave para usar para la clasificación
Entonces por ejemplo si tenemos
Podemos hacer
o
o
fuente
Puede usar la biblioteca de utilidades Lodash para resolver este problema (es una biblioteca bastante eficiente):
Puede encontrar documentación aquí: https://lodash.com/docs/4.17.15#orderBy
fuente
Puede crear un cierre y pasarlo de esa manera aquí está mi ejemplo trabajando
fuente
fuente
Array.sort()
para ordenar una matriz…
) para hacer que la función sea puraupdated_at
)Array.sort()
funciona restando dos propiedades del elemento actual y siguiente si es un número / objeto en el que puede realizar operaciones arrítmicasfuente
Me enfrento a lo mismo, así que manejo esto con un por qué genérico y construyo una función para esto:
fuente