Tengo una lista con elementos en mecanografiado:
let productList = [ {active: false, location: 2, description: "test 123"}, {active: false, location: 15, description: "test 123"}, {active: false, location: 40, description: "test 123"}, {active: false, location: 15, description: "test 123"}, {active: false, location: 1, description: "test 123"}, {active: true, location: 2, description: "test 123"}, {active: false, location: 2, description: "test 123"}, {active: false, location: 7, description: "test 123"}, {active: false, location: 1, description: "test 123"} ] Quiero ordenar esta lista para mostrar en la parte superior los elementos que tienen active: true y que tienen la misma ubicación, por ejemplo location: 0
Intenté esto, se ordena por activo en la parte superior:
productList.sort((a, b) => (b.active - a.active));Ahora también quiero agregar la ubicación para que aquellos con la misma ubicación se clasifiquen uno tras otro, uno de mis intentos fue este pero sin éxito:
productList.sort((a, b) => (b.active - a.active)&& ((a.location === b.location) ? 1 : -1) );Mi resultado final que quiero tener es mostrar activo en la parte superior e inmediatamente después de aquellos con la misma ubicación que el activo
let productList = [ {active: true, location: 2, description: "test 123"}, {active: false, location: 2, description: "test 123"}, {active: false, location: 2, description: "test 123"}, {active: false, location: 1, description: "test 123"}, {active: false, location: 1, description: "test 123"}, {active: false, location: 7, description: "test 123"}, {active: false, location: 15, description: "test 123"}, {active: false, location: 15, description: "test 123"}, {active: false, location: 40, description: "test 123"}, ]¿Puede alguien ayudarme por favor? Estoy atascado. Intenté de varias maneras pero no tuve éxito.
Deberá cambiar su primera condición para verificar si alguno de los elementos que coinciden con las ubicaciones a y b actuales están activos, no solo los elementos iterados actualmente. Aquí usando some() .
let productList = [ { active: false, location: 2, description: "test 123" }, { active: false, location: 15, description: "test 123" }, { active: false, location: 40, description: "test 123" }, { active: false, location: 15, description: "test 123" }, { active: false, location: 1, description: "test 123" }, { active: true, location: 2, description: "test 123" }, { active: false, location: 2, description: "test 123" }, { active: false, location: 7, description: "test 123" }, { active: false, location: 1, description: "test 123" } ]; const hasActive = (o) => Number(productList.some(e => o.location === e.location && e.active)); const compare = (a, b) => ( hasActive(b) - hasActive(a) || a.location - b.location || b.active - a.active ); console.log(productList.sort(compare));Una solución más complicada que primero agrupa por ubicación, luego ordena y mapea de nuevo a una matriz no agrupada.
function groupSort(arr) { const grouped = {}; for (const object of arr) { const { location, active } = object; grouped[location] ??= { location, active, objects: [] }; grouped[location].objects.push(object); if (active) { grouped[location].active = true; } } return Object.values(grouped) .sort((a, b) => b.active - a.active || a.location - b.location) .flatMap(({ objects }) => objects.sort((a, b) => b.active - a.active)); }; const productList = [{ active: false, location: 2, description: "test 123" }, { active: false, location: 15, description: "test 123" }, { active: false, location: 40, description: "test 123" }, { active: false, location: 15, description: "test 123" }, { active: false, location: 1, description: "test 123" }, { active: true, location: 2, description: "test 123" }, { active: false, location: 2, description: "test 123" }, { active: false, location: 7, description: "test 123" }, { active: true, location: 1, description: "test 123" }]; const sorted = groupSort(productList); console.log(sorted);