簡単なグラフ(グラフではなくデータ構造)の問題をデバッグするための助けが必要です。ノードを挿入するだけでなく、次のノードへのパスを作成することもできます。それは問題じゃない。問題は、私が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]
問題?私は多くの答えを見ても解決策を見つけることができませんでした。助けてくれてありがとう!
あなたの問題は次のようなコードにあると思われます: 'this.edges.push({[node1]:[]});'あなたはオブジェクトに新しいキーと値のペアをプッシュしていますが、 'node1'に含まれているもののキー名を与えます。しかし、node1は文字列ではないので、Javascriptはオブジェクトを '[object Object]'を返す文字列に変換しています –
私の質問:あなたは本当にどのキー名を使用しますか?おそらくあなたは 'node1.name'のようなものを入力するつもりでしたか? –
はい、私は現在returnGraph()メソッドの中に持っていて、グラフをJSONオブジェクトとして返しています。私はノードのインスタンスを作成するメソッドの外でも試しました。あなたがそれを逃した場合のために最後の段落でそれを説明しました。この問題は、そのノードの正確な文字列表現を返します。それはエスケープで埋められています。( – tear728