const breadthFirstSearch = (graph, start, end) => { const queue = graph[start]; const checked = []; let lastLevelElement = queue[queue.length - 1]; let level = 1; while (queue.length) { const candidate = queue.shift(); if (candidate === end) { return level; } if (checked.includes(candidate)) { continue; } queue.push(...(graph[candidate] || [])); if (candidate === lastLevelElement) { lastLevelElement = queue[queue.length - 1]; level += 1; } } return -1; } const graph = { a: ['b', 'c', 'd'], b: ['e', 'f'], d: ['e', 'g'], c: ['j', 'k'], e: ['l'] } const res = breadthFirstSearch(graph, 'a', 'l'); console.log('res', res);