¿Alguien puede ayudar a ordenar la siguiente matriz en orden ascendente/descendente? La matriz se ordenará según el número más alto en cada agrupación (agrupada según la marca). Los números en cada grupo también deben ordenarse:
original_array = [ { brand: "Ford", number: "1", }, { brand: "BMW", number: "1", }, { brand: "BMW", number: "5", }, { brand: "BMW", number: "20",}, { brand: "Toyota", number: "10",} ]; desc_order = [ { brand: "BMW", number: "20",}, { brand: "BMW", number: "5", }, { brand: "BMW", number: "1", }, { brand: "Toyota", number: "10",}, { brand: "Ford", number: "1", } ]; asc_order = [ { brand: "Ford", number: "1", }, { brand: "Toyota", number: "10",}, { brand: "BMW", number: "1", }, { brand: "BMW", number: "5", }, { brand: "BMW", number: "20",} ];
Dado que el orden de las marcas en la salida depende de los valores máximos en su grupo, sugeriría crear primero un objeto que enumere el número máximo por marca.
Luego use eso para ordenar, usando la siguiente secuencia de ordenación:
Implementación:
const array = [ { brand: "Ford", number: "1", }, { brand: "BMW", number: "1", }, { brand: "BMW", number: "5", }, { brand: "BMW", number: "20", }, { brand: "Toyota", number: "10", } ]; // First collect the maximum values per brand as an aggregate: const aggr = {}; for (let {brand, number} of array) { aggr[brand] = Math.max(number, aggr[brand] ?? number); } // Ascending array.sort((a, b) => aggr[a.brand] - aggr[b.brand] || a.brand.localeCompare(b.brand) || a.number - b.number); console.log(array); // Descending array.sort((a, b) => aggr[b.brand] - aggr[a.brand] || b.brand.localeCompare(a.brand) || b.number - a.number); console.log(array);