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

Postagens mais visitadas