Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

164
Views
Ordenar una matriz de objetos por orden ascendente de valores relacionados con otro valor

Estoy buscando ordenar una matriz de objetos JSON por orden ascendente de valores relacionados con otro valor. Suena confuso porque lo es. Tengo propiedades 'columna' y 'orden' en cada objeto en una matriz. Necesito que el orden sea como: el número más bajo en la columna 1, el número más bajo en la columna 2, el número más bajo en la columna 3, el segundo número más bajo en la columna 1, el segundo número más bajo en la columna 2, el segundo número más bajo en la columna 3 y continuar. Esto es fácil cuando 'order' tiene exactamente los mismos valores, puede usar una función de clasificación como:

 function sortCourses(a, b){ if (a.order == b.order) { return (a.column - b.column); } else { return (a.order - b.order); } }

El problema es que no siempre los tengo configurados así. Aquí hay una matriz de ejemplo:

 [ { column: 2, order: 5 }, { column: 1, order: 1 }, { column: 3, order: 2 }, { column: 3, order: 1 }, { column: 1, order: 4 }, { column: 2, order: 1 }, { column: 3, order: 3 }, { column: 1, order: 3 }, { column: 2, order: 3 }, { column: 1, order: 2 } ]

Después de ordenar, necesito que esta matriz se vea así:

 [ { column: 1, order: 1 }, { column: 2, order: 1 }, { column: 3, order: 1 }, { column: 1, order: 2 }, { column: 2, order: 3 }, { column: 3, order: 2 }, { column: 1, order: 3 }, { column: 2, order: 5 }, { column: 3, order: 3 }, { column: 1, order: 4 } ]

¿Alguna idea sobre cómo podría lograr esto?

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Podría ser un poco más rápido, pero espero que sea fácil de seguir.

 const data = [ { column: 2, order: 5 }, { column: 1, order: 1 }, { column: 3, order: 2 }, { column: 3, order: 1 }, { column: 1, order: 4 }, { column: 2, order: 1 }, { column: 3, order: 3 }, { column: 1, order: 3 }, { column: 2, order: 3 }, { column: 1, order: 2 } ]; // Sort by order. data.sort(function (a, b) { return (a.order - b.order); }); // Group by column. const groups = data.reduce( function (acc, value) { if (!acc[value.column]) { acc[value.column] = []; } acc[value.column].push(value); return acc; }, {}); // Get sorted columns. const cols = Object.keys(groups).map(Number).sort(); // Loop over columns taking lowest value until we're out of values. const out = []; while (out.length < data.length) { cols.forEach( function (col) { if (groups[col].length) { out.push(groups[col].shift(0)); } }); } console.log(out);
about 4 years ago · Santiago Trujillo Report

0

Un camino bastante largo, pero todo lo que hago es simplemente agrupar cada 'grupo' (columnas) en un objeto, empujando sus órdenes en una matriz. Luego los clasifico y los pego.

 var array = [ { column: 2, order: 5 }, { column: 1, order: 1 }, { column: 3, order: 2 }, { column: 3, order: 1 }, { column: 1, order: 4 }, { column: 2, order: 1 }, { column: 3, order: 3 }, { column: 1, order: 3 }, { column: 2, order: 3 }, { column: 1, order: 2 } ]; var new_array = {} for (let item of array) { if (item.column in new_array) { new_array[item.column].push(item.order); } else { new_array[item.column] = [item.order]; } } let max = 0; for (let key in new_array) { max = (max < new_array[key].length) ? new_array[key].length : max; new_array[key].sort(); } var final = []; for (let i = 0; i < max; i++) { for (let key in new_array) { if (i < new_array[key].length) { final.push({column: key, order: new_array[key][i]}); } } } console.log(final);

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!