【问题标题】:Javascript Class instance inside Class Method类方法中的 Javascript 类实例
【发布时间】:2021-10-27 14:02:47
【问题描述】:

对于下面的问题,我真的有点一头雾水。

我应该创建一个包含一组节点和边的图表。方法“add”应该检查边缘是重复还是反向重复。如果不是这种情况,则应将此新边添加到相应的集合中。因此,我需要在方法中创建 Edge 类的实例并执行 for 循环以检查条件是否满足。

我真的被困在这里,我希望你们中的一些人能给我一个提示:)

提前致谢 BR

class Graph {
  constructor() {
    this.nodes = new Set();
    this.edges = new Set();
}
add(m,n){
   const e = new Edge (m,n);

  }

};

class Edge {
  constructor(startpoint,endpoint) {
    this.startpoint = startpoint;
    this.endpoint = endpoint;
}
};

class Node {
  constructor(nodeName) {
    this.nodeName = nodeName
}
};

【问题讨论】:

    标签: javascript oop instance


    【解决方案1】:

    我认为Set 并不完全适合这个。如果您在每次添加时都构造Edge 对象并将它们添加到Set,那么这些最终将被比较,例如:

    new Edge(1, 1) === new Edge(1, 1);
    

    正如您可能知道的那样,这将始终是错误的,因为这是两个不同的对象。但是,您可以使用 Map 并使用唯一键来识别边缘。例如,它的构造函数参数。这样,您可以说new Edge(1,1) 键是"1,1"。如果密钥不存在:

    // ...
      this.edges = new Map();
    // ...
    
    let key = `${m},${n}`;
    if(!this.edges.has(key)){
    
    }
    

    然后你添加它:

    this.edges.set(key, e);
    

    【讨论】:

    • 非常感谢您!我希望我能问你一个后续问题。您的方法不包括 Edge 实例的实例化,对吧?因为那是我分配任务的一部分,很遗憾。我将如何实现它?
    • 没必要,可以是别的。但在答案中,最后一个 e 应该是 Edge 实例。
    • 对不起,如果我让你紧张了,但我对这个话题完全陌生。我还有最后两个问题 这个解决方案是否允许我:a)创建一个可用于 graphviz 的漂亮打印 b)我如何实现第二个约束,即没有反向重复。let key = ${m},${n};只符合第一个约束 - 没有重复对吗?
    • 我不完全确定反向复制是什么。 n, m 而不是 m, n?如果是这种情况,您可以只计算反向键 ${n}, ${m} 并检查它是否存在于地图上。或者,您可以将相同的 Edge 实例添加到反向键下的映射中。
    • 是的,就是这个意思。我现在已经这样实现了``` class Graph { constructor() { this.nodes = new Map(); this.edges = new Map(); } add(m,n){ const e = new Edge (m,n) let key = ${m},${n};让 key2 = ${n},${m}; if (this.edges.has(key)){ console.log("这违反了第一个 ocl 约束");} else if (this.edges.has(key2)){ console.log("这违反了第二个 ocl约束");} else { this.edges.set(key,e); } } }; ```这看起来是否正确?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2012-12-25
    • 2012-10-22
    相关资源
    最近更新 更多