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!
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)));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; }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 .