如何引用作为JavaScript键传递到映射中的类实例

如何引用作为JavaScript键传递到映射中的类实例,javascript,class,graph,vertex,Javascript,Class,Graph,Vertex,我正在使用贴图作为邻接列表来实现一个graph类,并使用一个简单的类Vertex来表示图形中的每个节点: export class Vertex { constructor(value) { if (value) this.value = value; else throw new Error("Value must be specified"); } getValue() { return this.value;

我正在使用贴图作为邻接列表来实现一个graph类,并使用一个简单的类Vertex来表示图形中的每个节点:

export class Vertex {
    constructor(value) {
        if (value) this.value = value;
        else throw new Error("Value must be specified");
    }

    getValue() {
        return this.value;
    }

    setValue(value) {
        if (value) this.value = value;
        else throw new Error("Value must be specified");
    }
}
然后在我的graph类中,我实现了一个构造函数和两个用于添加顶点和边的方法:

export class UndirectedGraph {
    constructor() {
        this.adjacencyList = new Map();
    }

    addVertex(value) {
        if (value) {
            const vertex = new Vertex(value);
            this.adjacencyList.set(vertex, []);
        }
    }

    addEdge(to, from) {
        if (
            !to ||
            !from ||
            !(to.constructor === Vertex && from.constructor === Vertex)
        ) {
            throw new Error("Arguments must be of type Vertex");
        }
        if (
            !this.adjacencyList.get(to) ||
            !this.adjacencyList.get(from)
        ) {
            throw new Error(
                "Both arguments must already be nodes in this undirected graph"
            );
        }
        this.adjacencyList.get(to).push(from);
        this.adjacencyList.get(from).push(to);
    }

    getAdjacencyList() {
        return this.adjacencyList;
    }
}
然后我想调用addEdge函数在Vertex类型的两个实例之间创建一条边:

const graph = new UndirectedGraph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("B");
graph.addEdge(..., ...);
要在A和B的特定实例之间创建边,我需要传递什么到addEdge函数?我没有可以引用的顶点实例的变量

我希望图形能够存储重复的值,例如名称,因此使用类实例似乎是一个明显的选择,但现在我被困在如何访问它们包含的值上,因为我不确定如何在映射中搜索类实例,即graph.getAdjacencyList.get。。。。所有帮助

如果addVertex方法创建顶点实例,并且addEdge方法希望将该实例作为参数,则需要将其返回给这些方法的调用方:

然后你可以像这样使用它

const graph = new UndirectedGraph();
const vertex1 = graph.addVertex("A");
const vertex2 = graph.addVertex("B");
const vertex3 = graph.addVertex("B");
graph.addEdge(vertex1, vertex2);
graph.addEdge(vertex1, vertex3);
graph.addEdge(vertex2, vertex3);

你能澄清一下你的意思吗?我希望这个图能够存储重复的值,比如名称,所以使用类实例似乎是一个明显的选择。我的思路是,如果我只添加字符串或数字或其他什么,那么任何重复项都会变得混乱。我怎样才能分辨出一根约翰·史密斯弦和另一根约翰·史密斯弦?类实例是唯一的,因此我应该能够区分我指的是哪个John Smith如果您希望能够存储具有相同字符串值的多个顶点,但仍然可以轻松区分它们,则需要在它们上存储另一段数据,就像ID一样。仅将字符串用于人类可读的显示,但是要用ID进行实际工作。不确定类实例如何让您区分顶点。这取决于用户存储返回值,是否有方法确保它们这样做而不仅仅是调用graph。addVertexYes当然会这样做,否则,它们无法在它们之间添加边…唯一的替代方法是为它们提供唯一的ID,而不是值,或者除了值之外
const graph = new UndirectedGraph();
const vertex1 = graph.addVertex("A");
const vertex2 = graph.addVertex("B");
const vertex3 = graph.addVertex("B");
graph.addEdge(vertex1, vertex2);
graph.addEdge(vertex1, vertex3);
graph.addEdge(vertex2, vertex3);