Tengo una matriz con una estructura similar a esta:
links = [ { orig:{ src:"A", target:"B"}, source:{}, target:{} }, { orig:{ src:"B", target:"C"}, source:{}, target:{} }, { orig:{ src:"C", target:"A"}, source:{}, target:{} }, { orig:{ src:"A", target:"C"}, source:{}, target:{} }, { orig:{ src:"C", target:"B"}, source:{}, target:{} } ]Necesito ordenar esta matriz en valores anidados "src" y "target" que están en el objeto "orig". Debe ordenarse alfabéticamente en "src", y si hay varios "src" con el mismo valor, entonces usa "target" para ver cuál debe colocarse antes que el otro.
El resultado ordenado deseado debe ser:
links = [ { orig:{ src:"A", target:"B"}, source:{}, target:{} }, { orig:{ src:"A", target:"C"}, source:{}, target:{} }, { orig:{ src:"B", target:"C"}, source:{}, target:{} }, { orig:{ src:"C", target:"A"}, source:{}, target:{} }, { orig:{ src:"C", target:"B"}, source:{}, target:{} } ]La matriz que necesito ordenar tiene más de 8 mil líneas. ¿Cuál sería una forma eficiente de lograr esto? Descubrí una forma "sucia" de hacerlo con varios bucles anidados, pero con 8000 líneas en la matriz, tomó mucho tiempo procesarlo. Así que no es una solución viable.
Aquí hay una clasificación simple en orig.src y luego en orig.target:
const links = [ { orig: { src: "A", target: "B" }, source: {}, target: {}, }, { orig: { src: "B", target: "C" }, source: {}, target: {}, }, { orig: { src: "C", target: "A" }, source: {}, target: {}, }, { orig: { src: "A", target: "C" }, source: {}, target: {}, }, { orig: { src: "C", target: "B" }, source: {}, target: {}, }, ]; links.sort(function (a, b) { return ( a.orig.src.localeCompare(b.orig.src) || a.orig.target.localeCompare(b.orig.target) ); }); console.log(links);