var MAX_DEPTH = 3; var findPath = function (source, target, u2f, visitor) { // u2f = user to friend source = Graph.userToIndex(source); target = Graph.userToIndex(target); var dist = [] var prev = [] var queue = [] var seen = [] dist[source] = 0 prev[source] = source queue[queue.length] = source var len = 1; while (len > 0) { var cur = queue.shift() // pop the front element --len; var d = dist[cur] if (cur == target) { var path = [] var pos = target while (prev[pos] != source) { path.unshift({ user: pos }); pos = prev[pos] } visitor(source, target, path) continue; //return d } if (d > MAX_DEPTH) return d var friends = u2f[cur]; if(!friends) continue; for (var fi = friends.length; fi--; ) { var next = friends[fi]; if(seen[next]) continue; seen[next] = true; var nextd = dist[next] ? dist[next] : 987654321 // inf if (d + 1 < nextd) { dist[next] = d + 1 prev[next] = cur queue[len] = next ++len; } } } return dist[target] } findPath;