Tengo esta matriz desordenada (que contiene objetos)
toSortArray = [{taskID: 1, "title": "something1", subtasks: {}}, {taskID: 5, "title": "something5", subtasks: {}}, {taskID: 8, "title": "something8", subtasks: {}}];y tengo esta matriz que se completa dinámicamente en función del posicionamiento correcto de los ID de tareas
sortingArray = [8, 1, 5];Lo que estoy tratando de hacer es ordenar 'toSortArray' con exactamente el mismo orden que se indica en 'sortingArray'.
He encontrado una solución algo llamada aquí que indica esto:
var arr = ['one','four','two']; var test = [{ key: 'one' },{ key: 'two' },{ key: 'four' }]; function sortFunction(a,b){ var indexA = arr.indexOf(a['key']); var indexB = arr.indexOf(b['key']); if(indexA < indexB) { return -1; }else if(indexA > indexB) { return 1; }else{ return 0; } }Sin embargo, no funciona para mí. Reemplacé los marcadores de posición para:
function sortFunction (a,b) { var indexA = sortingArray.indexOf(a["taskID"]); console.log(indexA); var indexB = sortingArray.indexOf(b["taskID"]); console.log(indexB); if (indexA < indexB) { return -1; } else if (indexA > indexB) { return 1; } else { return 0; } }Cuando depuré (como puede ver, estoy registrando en la consola indexA e indexB). Siempre devuelven -1, lo que significa que no se encuentra dicho índice.
Mi pregunta es cómo llegar a comparar el valor "taskID" y los elementos sortingArray.
Gracias :)
Descargo de responsabilidad: en los ejemplos, eliminé propiedades que no son relevantes para la pregunta y también cambié el nombre de taskID a tID por brevedad.
Puede usar Array.prototype.reduce para lograr el resultado deseado:
let arr = [{tID: 1},{tID: 5},{tID: 8}]; let sArr = [8, 1, 5]; const result = sArr.reduce((a,v) => a.concat(arr.find(({tID})=>tID===v)), []); console.log(result); También puede usar Array.prototype.sort :
let arr = [{tID: 1},{tID: 5},{tID: 8}]; let sArr = [8, 1, 5]; const result = arr.sort( ({tID: aID}, {tID: bID}) => sArr.indexOf(aID) - sArr.indexOf(bID)); console.log(result); Array.prototype.map también hará el trabajo:
let arr = [{tID: 1},{tID: 5},{tID: 8}]; let sArr = [8, 1, 5]; const result = sArr.map(i => arr.find(({tID}) => tID === i)); console.log(result); map y reduce probablemente funcionarán más rápido que sort porque cada iteración solo requiere una única búsqueda ( find ) en toSortArray , a diferencia de sort , que requiere dos búsquedas ( indexOf ).
Puede filtrar toSortArray en función de cada uno de los valores del elemento sortingArray . El uso de filter devolverá una matriz de un elemento que coincida con el valor actual. Dado que filter devuelve una matriz, use flatMap() para iterar sobre sortingArray y devolver una única matriz ordenada en el orden de sortingArray .
const toSortArray = [{taskID: 1, "title": "something1", subtasks: {}}, {taskID: 5, "title": "something5", subtasks: {}}, {taskID: 8, "title": "something8", subtasks: {}}]; const sortingArray = [8, 1, 5]; const result = sortingArray.flatMap(so=>toSortArray.filter(ts=>ts.taskID === so)); console.log(result);Puede usar el mapa y buscar como:
toSortArray = [{ taskID: 1, "title": "something1", subtasks: {} }, { taskID: 5, "title": "something5", subtasks: {} }, { taskID: 8, "title": "something8", subtasks: {} }]; sortingArray = [8, 1, 5]; const result = sortingArray.map((item) => toSortArray.find((element) => element.taskID === item)); console.log(result);