在“for”–“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打印所有nodeIds :


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.


MMTTMM
浏览 167回答 4
4回答

尚方宝剑之说

您使用了错误的 for 循环。尝试将其更改为:printGraph(){  for (let node of this.nodes){    console.log(node.nodeId);  }   } for..of 循环应该按照您想要的方式循环遍历节点。结果:123

炎炎设计

我认为问题可能是您使用“for in”循环而不是“for of”来迭代数组。“for in”循环用于迭代对象属性

慕哥9229398

看来您正在使用关键字迭代数组对象的属性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);}

蓝山帝景

你需要打印,console.log(node); 因为你正在循环槽let node in this.nodesnode实际节点来自哪里this.nodes
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript