Tengo esta matriz de objetos:
var eventList = [ { eventName: "abc", status: "completed" }, { eventName: "def", status: "live" }, { eventName: "ghi", status: "live" }, { eventName: "jkl", status: "upcoming" }, ] Quiero ordenar esta matriz de objetos usando una matriz de prioridad de una clave específica, digamos ["live", "upcoming", "completed"] para el estado, lo que significa que todos los eventos en vivo van primero, seguidos de los próximos seguidos de completados. Las respuestas en todo Internet parecen que solo puede ordenar objetos de matriz usando teclas como ascendente o descendente. ¿Cómo me acerco a esto?
Podría hacerlo usando el método Array.prototype.sort() con una matriz de ordenación.
const eventList = [ { eventName: 'abc', status: 'completed', }, { eventName: 'def', status: 'live', }, { eventName: 'ghi', status: 'live', }, { eventName: 'jkl', status: 'upcoming', }, ]; const order = ['live', 'upcoming', 'completed']; eventList.sort((x, y) => order.indexOf(x.status) - order.indexOf(y.status)); console.log(eventList); Si desea que la búsqueda de índices sea más rápida al ordenar, puede usar Map Object .
const eventList = [ { eventName: 'abc', status: 'completed', }, { eventName: 'def', status: 'live', }, { eventName: 'ghi', status: 'live', }, { eventName: 'jkl', status: 'upcoming', }, ]; const order = ['live', 'upcoming', 'completed']; const map = new Map(); order.forEach((x, i) => map.set(x, i)); eventList.sort((x, y) => map.get(x.status) - map.get(y.status)); console.log(eventList);Puede hacer esto sin clasificar por una complejidad de tiempo lineal agrupando primero su matriz según el status y luego usando .flatMap() en su matriz de orden. Para cada valor en la matriz ordenada, puede tomar el valor agrupado de la agrupación en O(1) (es decir, instantáneamente) y mapear esos objetos agrupados. Como está utilizando flatMap, estos objetos agrupados se aplanarán en la matriz resultante:
const eventList = [ { eventName: "abc", status: "completed" }, { eventName: "def", status: "live" }, { eventName: "ghi", status: "live" }, { eventName: "jkl", status: "upcoming" }, ]; const order = ["live", "upcoming", "completed"]; const grouped = eventList.reduce( (map, o) => map.set(o.status, (map.get(o.status) || []).concat(o)), new Map ); const result = order.flatMap(status => grouped.get(status) || []); console.log(result);