# How does this findRoute function work in Chapter 7 of Eloquent Javascript 3rd Edition?

In the Chapter 7 of Eloquent Javascript 3rd Edition, the author creates a function `findRoute` to find the shortest route between two locations. It’s so hard to understand it for beginners like me. Can anybody help explain how it works?

The `roadGraph` is the map data that will be passed to the `findRoute` function as `graph`:

``````    // Places and roads of Meadowfield

"Alice's House-Bob's House", "Alice's House-Cabin",
"Alice's House-Post Office", "Bob's House-Town Hall",
"Daria's House-Ernie's House", "Daria's House-Town Hall",
"Ernie's House-Grete's House", "Grete's House-Farm",
"Grete's House-Shop", "Marketplace-Farm",
"Marketplace-Post Office", "Marketplace-Shop",
"Marketplace-Town Hall", "Shop-Town Hall"
];

//function to convert the roads into a data structure

function buildGraph(edges) {

let graph = Object.create(null);

if (graph[from] == null) {
graph[from] = [to];
} else {
graph[from].push(to);
}
}

for (let [from, to] of edges.map(r => r.split("-"))) {
}

return graph;

}

// assign the data structure to roadGraph

// The function that searches the shortest route between two places in roadGraph

function findRoute(graph, from, to) {

let work = [{
at: from,
route: []
}];

for (let i = 0; i < work.length; i++) {

let {
at,
route
} = work[i];

// I'm especially confused on the following loop

for (let place of graph[at]) {

if (place == to) return route.concat(place);

// so confuesd on the following if statement, how does it work at all?

if (!work.some(w => w.at == place)) {
work.push({
at: place,
route: route.concat(place)
});
}

}

}

}
``````
1 Like

1 Like

This is the easy version of the findRoute() function.

``````function findRoute(graph, from, to){

let result = [{at : from, route : []}];
for(let i = 0; i < result.length; i++){
let {at, route} = result[i];
for(place of graph[at]){
if(place != to){
result.push({at : place, route : route.concat(place)});
}else{
return route.concat(place);
}
}
}
}
``````