在 `for`–`in` 循环中访问对象的属性会导致 `undefined`

Accessing properties from object in `for`–`in` loop results in `undefined`

我有这两个类:

class Node {
    constructor(nodeId){
        this.nodeId = nodeId;
        this.adjacencies = [];
    }

    connectToNode(nodeToConnectTo){
        this.adjacencies.push(nodeToConnectTo);
    }
}

class Graph{
    constructor(nodes){
        this.nodes = nodes;
    }

    printGraph(){
        for (let node in this.nodes){
            console.log(node.nodeId);
        }
        
    }
}

我只是想调用 printGraph 以这种方式打印所有 nodeId

let node1 = new Node('1');
let node2 = new Node('2');
let node3 = new Node('3');
const arr = [node1, node2, node3];
let graph = new Graph(arr);

graph.printGraph();

但它正在打印 undefined。我似乎无法弄清楚为什么它不只是打印 nodeId.

你需要打印 console.log(node); 因为你正在循环 let node in this.nodes

其中 node 是来自 this.nodes

的实际节点

我认为问题可能出在您使用“for in”循环而不是“for of”循环遍历数组。

“for in”循环用于迭代对象属性

您使用了错误的 for 循环。 尝试将其更改为:

printGraph(){
  for (let node of this.nodes){
    console.log(node.nodeId);
  }   
} 

for..of 循环应该按照您想要的方式在节点上循环。
结果:

1
2
3

您似乎在使用 in 关键字迭代数组对象的属性。对于数组,这意味着您要遍历 索引(键),即 3 成员数组中的 0、1、2。这些是字符串,没有 nodeId 属性,所以你的输出是 undefined。如果您在当前循环中 运行 console.log(node, typeof node)(与 in 保持一致),您会看到这些。

如果您在 for 循环中使用 of 关键字,您将获得数组的 ,即具有 1、2 和 3 的对象nodeId 的值。所以你所要做的就是将 in 更改为 of 并且你将获得你想要的输出。

就我个人而言,我会使用这个:

printGraph(){
    const nodeIds = this.nodes.map(node => node.nodeId);
    console.log(nodeIds);
}