Cuando intento la función buildGraph con la función normal, funciona correctamente, pero con la función de flecha obteniendo obj vacío como salida. Se necesita ayuda.
var 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" ]; let buildGraph = (edges) => { let obj = {} let addEdge = (from, to) => ( obj[from] === null ? obj[from] = [to] : obj[from]?.push(to) ) edges.map(r => r.split("-")).map(([from, to]) => addEdge(from, to)) return obj; } console.log(buildGraph(roads)) // Output: {}
Reemplace null
con undefined
. Si no se encuentra una key
en un objeto, devuelve undefined
, no null
.
var 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", ]; let buildGraph = (edges) => { let obj = {}; let addEdge = (from, to) => obj[from] === undefined ? (obj[from] = [to]) : obj[from]?.push(to); edges.map((r) => r.split("-")).map(([from, to]) => addEdge(from, to)); return obj; }; console.log(buildGraph(roads));
No es la función de flecha, es esta comparación:
obj[from] === null
El operador ===
realiza una comparación de tipos exacta, y para las propiedades que no existen en un objeto, el tipo exacto de la propiedad no es null
, es undefined
. Entonces esa comparación es false
y la propiedad nunca se agrega al objeto.
Compáralo con undefined
en su lugar:
var 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" ]; let buildGraph = (edges) => { let obj = {} let addEdge = (from, to) => ( obj[from] === undefined ? obj[from] = [to] : obj[from]?.push(to) ) edges.map(r => r.split("-")).map(([from, to]) => addEdge(from, to)) return obj; } console.log(buildGraph(roads)) // Output: {}
También puedes usar .reduce()
. Se usa a menudo si quieres agrupar algo
var 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" ]; let result = roads.reduce((obj, road) => { let [from, to] = road.split("-") obj[from] ? obj[from].push(to) : obj[from] = [to] return obj },{}) console.log(result)