简体   繁体   中英

I need help to understand this function

This code from ( Eloquent Javascript chapter 7 3rd edition ).

A mail-delivery robot picking up and dropping off parcels. The village consists of 11 places with 14 roads between them. It can be described with this array of roads.

const roads = [
  "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",
];

// Okay I was trying to understand this function below but I couldn't, specially the for loop

function buildGraph(edges) {
  let graph = Object.create(null);
  function addEdge(from, to) {
    if (graph[from] == null) graph[from] == [to];
    else graph[from].push(to);
  }
  for (let [from, to] of edges.map((r) => r.split("-"))) {
    addEdge(from, to);
    addEdge(to, from);
  }
  return graph;
}
const roadGraph = buildGraph(roads);

What does the for loop do?

edges.map() calls a function on each element of the edges array (which corresponds to the global roads array because it's the argument to the function). It collects all the return values into an array and returns this.

The function it calls uses .split('-') to split each string into an array, using - as the delimiter. For example, the string "Alice's House-Bob's House" becomes ["Alice's House", "Bob's House"] . So together with .map() , this returns an array of nested arrays:

[
    ["Alice's House", "Bob's House"],
    ["Alice's House", "Cabin"],
    ...
]

The for-of loop then iterates over the elements of this array. Using the destructuring pattern [from, to] as the iteration variable assigns the variables from and to from the corresponding elements of each nested array. So on the first iteration from = "Alice's House" and to = "Bob's House" . On the second iteration from = "Alice's House" and to = "Cabin" .

The loop body then calls addEdge() with these variables to create graph edges that connect the two nodes in each direction.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM