Sort
function ordenarSteps(arr) {
// Criar um mapa para fácil acesso aos objetos por stepId
const stepMap = new Map(arr.map(step => [step.stepId, step]));
// Calcular o grau de entrada (quantos steps apontam para ele)
const inDegree = new Map(arr.map(step => [step.stepId, 0]));
arr.forEach(step => step.nextIds.forEach(id => inDegree.set(id, (inDegree.get(id) || 0) + 1)));
// Filtrar os steps que não possuem steps anteriores (grau de entrada 0)
const queue = [...arr.filter(step => inDegree.get(step.stepId) === 0)];
const ordered = [];
// Ordenação baseada em Kahn's Algorithm (Algoritmo de Ordenação Topológica)
while (queue.length > 0) {
const current = queue.shift();
ordered.push(current);
current.nextIds.forEach(id => {
inDegree.set(id, inDegree.get(id) - 1);
if (inDegree.get(id) === 0) {
queue.push(stepMap.get(id));
}
});
}
return ordered;
}
var arr = [
{ stepId: "extracao", nextIds: ["roteia"] },
{ stepId: "saida", nextIds: [] },
{ stepId: "entrada", nextIds: ["extracao"] },
{ stepId: "roteia", nextIds: ["saida", "erro"] },
{ stepId: "erro", nextIds: ["saida"] }
];
console.log(ordenarSteps(arr));
Comentários
Postar um comentário