javascript - Ordenar arreglo de objetos con TypeScript por valor
¿Cómo puedo ordenar este arreglo de objetos por el valor del objeto? Estoy usando TypeScript.
console.log(this.items);
Salida :
(6) [{…}, {…}, {…}, {…}, {…}, {…}]
{id: 3, ref: "P-201721", active: 1, visible: 1, weigth: 0.3, …}
{id: 4, ref: "P-201722", active: 1, visible: 1, weigth: 0.3, …}
{id: 1, ref: "P-201710", active: 1, visible: 1, weigth: 0.5, …}
{id: 2, ref: "P-201711", active: 1, visible: 1, weigth: 0.5, …}
{id: 5, ref: "P-201831", active: 1, visible: 1, weigth: 0.2, …}
{id: 6, ref: "P-201832", active: 1, visible: 1, weigth: 0.2, …}
Intenté esto, pero el arreglo mantiene el mismo orden: Ordenar un arreglo con arreglos dentro por cadena
Respuesta #1
Ordenar un arreglo de objetos puede ser un poco complicado. Tienes que pasar una función de ordenamiento personalizada para definir cómo quieres comparar los objetos. ¿De qué otra manera sabría .sort() que quieres ordenar por id? Tal vez quieras ordenar por peso en su lugar.
He preparado un ejemplo en https://codepen.io/anon/pen/PEReGE?editors=0012. Puedes reemplazar las referencias de id con cualquier propiedad si quieres que se ordene por esa en su lugar.
items.sort((a, b) => {
if(a.id > b.id) {
return 1;
} else if(a.id < b.id) {
return -1;
} else {
return 0;
}
});
Si estás ordenando por una propiedad numérica, puedes usar esta abreviatura:
items.sort((a, b) => {
return a.id - b.id;
});
Respuesta #2
Puedes usar Lodash para lograr lo que quieres. También puedes usar múltiples opciones de ordenamiento pasando las claves en el arreglo dentro de la función sortBy.
var data = [
{"id": 3, "ref": "P-201721", "active": 1, "visible": 1, "weight": 0.3},
{"id": 4, "ref": "P-201722", "active": 1, "visible": 1, "weight": 0.3},
{"id": 1, "ref": "P-201710", "active": 1, "visible": 1, "weight": 0.5},
{"id": 2, "ref": "P-201711", "active": 1, "visible": 1, "weight": 0.5},
{"id": 5, "ref": "P-201831", "active": 1, "visible": 1, "weight": 0.2},
{"id": 6, "ref": "P-201832", "active": 1, "visible": 1, "weight": 0.2}
]
var sort = _.sortBy(data, ["id","weight"]);
console.log(sort);<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>