Digamos que tengo una matriz de objetos:
Objects = [ { "id": 1, "name": Joseph, function: "preacher"}, { "id": 2, "name": Ann, function: "singer"}, { "id": 3, "name": Miles, function: "preacher"}, { "id": 4, "name": Jack, function: "singer"}, { "id": 5, "name": Igor, function: "secretary"} ];Y también una serie de propiedades:
sort = ['function', 'name'];Tengo que ordenar la matriz de Objetos , usando una combinación de propiedades (ordenar matriz). Así que lo hice así:
const intlCollator = new Intl.Collator('pt-BR', { usage: 'sort' }); Objects.sort( (x, y) => (intlCollator.compare(x[sort[0]], y[sort[0]])) || (intlCollator.compare(x[sort[1]], y[sort[1]])) || (intlCollator.compare(x[sort[2]], y[sort[2]])) );¿Cómo haría la clasificación dinámica? Quiero decir, iterar usando combinaciones de clasificación de variables. Por ejemplo:
sort = ['function', 'name'];O:
sort = ['name'];Puede iterar las claves hasta que una comparación devuelva un valor no falso.
const objects = [{ id: 1, name: "Joseph", function: "preacher" }, { id: 2, name: "Ann", function: "singer" }, { id: 3, name: "Miles", function: "preacher" }, { id: 4, name: "Jack", function: "singer" }, { id: 5, name: "Igor", function: "secretary" }], intlCollator = new Intl.Collator('pt-BR', { usage: 'sort' }), sort = ['function', 'name']; objects.sort((a, b) => { let r; sort.some(k => r = intlCollator.compare(a[k], b[k])); return r; }); console.log(objects);Dado que el tipo ES10 es estable . Eso significa que primero puede ordenar usando la primera clave, luego ordenar la segunda y así sucesivamente.
const Objects = [ { "id": 1, "name": "Joseph", function: "preacher"}, { "id": 2, "name": "Ann", function: "singer"}, { "id": 3, "name": "Miles", function: "preacher"}, { "id": 4, "name": "Jack", function: "singer"}, { "id": 5, "name": "Igor", function: "secretary"} ]; const sort = ['name', 'function']; const intlCollator = new Intl.Collator('pt-BR', { usage: 'sort' }); sort.forEach(s => { Objects.sort((l, r) => intlCollator.compare(l[s], r[s])); }); console.log(Objects);