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

150
Views
¿Puedo ordenar una matriz de objetos en función de una matriz de subarreglos?

Me gustaría hacer una pregunta sobre la clasificación.

Digamos que tengo una matriz de objetos:

 let arrayToBeSorted = [ { name:"name1", id:"id1", }, { name:"name2", id:"id2", }, { name:"name3", id:"id3", }, { name:"name4", id:"id4", }, { name:"name5", id:"id5", }, { name:"name6", id:"id6", }];

Y digamos que tengo una matriz de sub matrices, cada una de las cuales contiene una cadena de ID como esa:

 let sortArray = [["id2", "id1"], ["id5"], ["id6","id3","id4"]]

Lo que quiero hacer es ordenar el arrayToBeSorted en función de sortArray conservando cada subarreglo (para mantener un orden hermético)

Este es el resultado buscado:

 arrayToBeSorted = [ { name:"name2", id:"id2", }, { name:"name1", id:"id1", }, { name:"name5", id:"id5", }, { name:"name6", id:"id6", }, { name:"name3", id:"id3", }, { name:"name4", id:"id4", }];

EDITAR: Traté de:

 arrayToBeSorted.sort((a,b)=> for(var i=0; i<sortArray.length;i++) { sortArr.indexOf(a.item.id) - sortArr.indexOf(b.item.id) });

También pensé en ordenar por cada matriz y la concatenación del resultado ordenado, pero no tuve éxito...

¡Gracias!

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Parece que está complicando demasiado la operación de clasificación aquí. Use sort() en arrayToBeSorted y obtenga el indexOf cada elemento de la matriz en una copia flat() de sortArray :

 let arrayToBeSorted = [{ name: "name1", id: "id1", }, { name: "name2", id: "id2", }, { name: "name3", id: "id3", }, { name: "name4", id: "id4", }, { name: "name5", id: "id5", }, { name: "name6", id: "id6", }]; let sortArray = [ ["id2", "id1"], ["id5"], ["id6", "id3", "id4"] ]; console.log(arrayToBeSorted.sort((a, b) => sortArray.flat().indexOf(a.id) - sortArray.flat().indexOf(b.id)));

about 4 years ago · Juan Pablo Isaza Report

0

Puede aplanar la matriz y construir un objeto con el orden deseado y ordenar la matriz.

 const data = [{ name: "name1", id: "id1" }, { name: "name2", id: "id2" }, { name: "name3", id: "id3" }, { name: "name4", id: "id4" }, { name: "name5", id: "id5" }, { name: "name6", id: "id6" }], sortArray = [["id2", "id1"], ["id5"], ["id6", "id3", "id4"]], order = Object.fromEntries(sortArray.flat().map((k, i) => [k, i + 1])); data.sort((a, b) => order[a.id] - order[b.id]); console.log(data);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Report

0

Puede usar sort() basado en un sortArray aplanado usando findIndex() o indexOf() como @esqew. También puede ir un paso más allá y preprocesar sortArray y crear identificadores de objeto como claves e índices de sortArray como valores. Entonces la función de clasificación se basaría en el objeto de la siguiente manera:

 let arrayToBeSorted = [{ name: "name1", id: "id1", }, { name: "name2", id: "id2", }, { name: "name3", id: "id3", }, { name: "name4", id: "id4", }, { name: "name5", id: "id5", }, { name: "name6", id: "id6", } ]; let sortArray = [["id2", "id1"], ["id5"], ["id6","id3","id4"]]; const flatO = Object.fromEntries( sortArray.flat().map((id,i) => [id,i]) ); const sortedArray = arrayToBeSorted.sort((a,b) => flatO[a.id] - flatO[b.id]); console.log( sortedArray );

NOTA : Esto es equivalente a la solución de @NinaScholz. Lo vi justo después de publicar esto. He votado a favor de las soluciones de @NinaScholz y @esqew, pero tomaría la de @NinaScholz ya que el método flat() , incluida la creación del objeto de order se ejecuta SOLO UNA VEZ .

about 4 years ago · Juan Pablo Isaza 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!