Tengo una serie de objetos que determinan cuáles deben mostrarse primero. Un ejemplo de esta matriz sería:
[ { "id": "b94ae1a5-c6b2-4e45-87cd-a4036fdb7870", "prerequisites_ids": [ "2a4fdd9c-45d0-49d9-a0eb-ba5a0464f2b1" ] }, { "id": "ef7d2415-808f-4efc-939e-2692f38a5ee7", "prerequisites_ids": [ "74e41a2c-e74e-4016-bb2c-f2e84c04fe92" ] }, { "id": "74e41a2c-e74e-4016-bb2c-f2e84c04fe92", "prerequisites_ids": [] }, { "id": "2a4fdd9c-45d0-49d9-a0eb-ba5a0464f2b1", "prerequisites_ids": [ "ef7d2415-808f-4efc-939e-2692f38a5ee7" ] } ]¿Cómo podría ordenarlo para obtener esto?
[ { "id": "74e41a2c-e74e-4016-bb2c-f2e84c04fe92", "prerequisites_ids": [] }, { "id": "ef7d2415-808f-4efc-939e-2692f38a5ee7", "prerequisites_ids": [ "74e41a2c-e74e-4016-bb2c-f2e84c04fe92" ] }, { "id": "2a4fdd9c-45d0-49d9-a0eb-ba5a0464f2b1", "prerequisites_ids": [ "ef7d2415-808f-4efc-939e-2692f38a5ee7" ] }, { "id": "b94ae1a5-c6b2-4e45-87cd-a4036fdb7870", "prerequisites_ids": [ "2a4fdd9c-45d0-49d9-a0eb-ba5a0464f2b1" ] } ]He intentado crear una función personalizada:
export function comparePrerequisites(a, b) { if (!a.prerequisites_ids) { return -1 } if (a.prerequisites_ids.includes(b.id)) { return 1; } } data.sort(comparePrerequisites)pero no parece funcionar. ¡Gracias por adelantado!
Tenemos aquí los requisitos para una ordenación topológica . Este no es un trabajo para el método de sort . En su lugar, puede usar la recursividad (un recorrido DFS) para profundizar en una dependencia que ya está recopilada o en una hoja (sin dependencias).
Aquí hay una implementación:
function topologicalSort(tasks) { const visited = new Set; const taskMap = new Map(tasks.map(task => [task.id, task])); function dfs(tasks) { for (let task of tasks) { if (!visited.has(task.id)) { dfs(task.prerequisites_ids.map(id => taskMap.get(id))); } visited.add(task); } } dfs(tasks); return [...visited]; } // Demo on your example: let tasks = [{"id": "b94ae1a5-c6b2-4e45-87cd-a4036fdb7870","prerequisites_ids": ["2a4fdd9c-45d0-49d9-a0eb-ba5a0464f2b1"]},{"id": "ef7d2415-808f-4efc-939e-2692f38a5ee7","prerequisites_ids": ["74e41a2c-e74e-4016-bb2c-f2e84c04fe92"]},{"id": "74e41a2c-e74e-4016-bb2c-f2e84c04fe92","prerequisites_ids": []},{"id": "2a4fdd9c-45d0-49d9-a0eb-ba5a0464f2b1","prerequisites_ids": ["ef7d2415-808f-4efc-939e-2692f38a5ee7"]}]; console.log(topologicalSort(tasks));