2016-08-23 6 views
0

簡単なグラフ(グラフではなくデータ構造)の問題をデバッグするための助けが必要です。ノードを挿入するだけでなく、次のノードへのパスを作成することもできます。それは問題じゃない。問題は、私がreturnGraphと呼ぶと、最初のインデックスのノードが[object Object]として返されますが、他のすべてのノードは返されるべきであるため、返されます。途中でAngularJSと擦れています。Javascriptでグラフを作成する - 問題

私は解決策を探しましたが、これはオブジェクトの組み込み文字列メソッドまたはjavascriptオブジェクトとjsonオブジェクトの間の競合のいずれかと関係があることをいくつかの場所で読みました。残念ながら、私はJavascript内部についてあまりよく知らないので少し失っています。

まず第一には、ここで私が使用しています例JSONオブジェクトである:ここで

//JSON object waiting to be passed to Node() 
obj1 = { 
    id: 6111, 
    name: "Node1", 
    stats: { 
     "speed": 4 
    }, 
    ranks: 5, 
    prereq: 0 
} 

は、コードの残りの部分である:

//Pass data from the JSON object through the constructor to create a node 
function Node(data){ 

    this.name = data.name; 
    this.stats = data.stats; 
    this.maxRank = data.ranks; 
    this.rank = 0; 
} 

//Return node name 
Node.prototype.returnName = function(){ 
    return this.name; 
} 

//Increase node rank 
Node.prototype.increaseRank = function(){ 
    if (this.rank < this.maxRank){ 
     this.rank += 1; 
    } 
    console.log(this.rank); 
} 



//Graph object 
function Graph(){ 
    this.edges = [] 
} 

Graph.prototype.returnNeighbors = function(node){ 
    return this.edges[node]; 
} 

Graph.prototype.addNeighbor = function(node1, node2, node3, node4){ 

    // Prints out node1 as an object 
    console.log(node1); // Prints out node1 as an object 
    if (node1 == null){ 
     console.log("something went terribly wrong!"); 
    } 
    else if (node1 != null && node2 == null && node3 == null && node4 == null) { 
     this.edges.push({[node1]: []}); 
    } 
    else if (node4 == null){ 
     this.edges.push({[node1]:[node2, node3]}) 
    } 
    else{ 
     this.edges.push({[node1]: [node2, node3, node4]}) 
    } 
} 

Graph.prototype.returnGraph = function(){ 
    return JSON.stringify(this.edges, null, 2); 
} 


// create a node for each JSON object 
$scope.node1 = new Node(obj1); 
$scope.node2 = new Node(obj2); 
$scope.node3 = new Node(obj3); 
$scope.node4 = new Node(obj4); 


// create graph 
var g = new Graph(); 
g.addNeighbor($scope.node1, $scope.node2, $scope.node3, $scope.node4); 
$scope.g = g; 

console.log(g.returnGraph()); 

問題は何より上にあるとある場所です文が印刷されます。これはGraphである点に注意してください。

[ 
    { 
    "[object Object]": [ 
     { 
     "name": "Node2", 
     "stats": { 
      "speed": 4 
     }, 
     "maxRank": 5, 
     "rank": 0 
     }, 
     { 
     "name": "Node3", 
     "stats": { 
      "attack": 4 
     }, 
     "maxRank": 5, 
     "rank": 0 
     }, 
     { 
     "name": "Node4", 
     "stats": { 
      "block": 4 
     }, 
     "maxRank": 5, 
     "rank": 0 
     } 
    ] 
    } 
] 

私はJSON.parse()を使用してみましたが、それは働いていませんでした。また、最初のノードをJSON.stringify()という文字列に変換してから、実際のオブジェクトの代わりにその文字列データを直接入力して、私を近づけましたが、エスケープ(\\\t\n)でいっぱいでした。正規表現を使用してもそれをきれいにするのに役立ちませんでした。

この問題を解決する良い方法がありますか?[object Object]問題?私は多くの答えを見ても解決策を見つけることができませんでした。助けてくれてありがとう!

+0

あなたの問題は次のようなコードにあると思われます: 'this.edges.push({[node1]:[]});'あなたはオブジェクトに新しいキーと値のペアをプッシュしていますが、 'node1'に含まれているもののキー名を与えます。しかし、node1は文字列ではないので、Javascriptはオブジェクトを '[object Object]'を返す文字列に変換しています –

+0

私の質問:あなたは本当にどのキー名を使用しますか?おそらくあなたは 'node1.name'のようなものを入力するつもりでしたか? –

+0

はい、私は現在returnGraph()メソッドの中に持っていて、グラフをJSONオブジェクトとして返しています。私はノードのインスタンスを作成するメソッドの外でも試しました。あなたがそれを逃した場合のために最後の段落でそれを説明しました。この問題は、そのノードの正確な文字列表現を返します。それはエスケープで埋められています。( – tear728

答えて

1

私はあなたがこのようなあなたのaddNeighbor()機能を更新することを示唆している:

Graph.prototype.addNeighbor = function(node1, node2, node3, node4){ 
    // Prints out node1 as an object 
    console.log(node1); // Prints out node1 as an object 
    if (node1 == null){ 
     console.log("something went terribly wrong!"); 
    } 
    else if (node1 != null && node2 == null && node3 == null && node4 == null) { 
     this.edges.push({[node1.name]: []}); 
    } 
    else if (node4 == null){ 
     this.edges.push({[node1.name]:[node2, node3]}) 
    } 
    else{ 
     this.edges.push({[node1.name]: [node2, node3, node4]}) 
    } 
} 

あなたは既存のオブジェクトに新しいオブジェクトをプッシュしています。新しいオブジェクトにはnode1.nameと定義されたキーがあり、キー名の実際の文字列値が与えられます。あなたのコードはnode1を使用していました。 Javascriptはnode1が文字列ではないことに気付くので、自動的にオブジェクトを文字列に変換します。文字列は[object Object]からです。

+0

'node1'を' [] 'から取り除くと言っていますか?実際にこれを試してみましたが、値は文字どおり' node1'になります。ノード '' Node1 "'、これは 'node1.name'の値で、私が期待していた値です – tear728

+0

これは間違っています。ありがとう – tear728

+0

Javascriptがnode1.nameをキーとして使用するように、角かっこを残しておきます。それ以外の場合は、ドット表記のピリオドで混乱するため、エラーが発生します。 –

関連する問題