質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2533閲覧

再帰処理で、オブジェクトの特定キーを複数文字列にするとエラーになるのですが、なぜでしょうか?

re97

総合スコア208

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/04/23 04:20

エラーにならない

javascript

1var tree = { 2 piyo : {val : "1", oya : ""}, 3 z : {val : "2", oya : "piyo"}, 4 b : {val : "3", oya : "z"}, 5 c : {val : "4", oya : "b"} 6}; 7 8hoge(tree, Object.keys(tree)[0]); 9 10function hoge (obj, node) { 11 var str = obj[node].val; 12 var ko = []; 13 for (var i in obj) { 14 if (obj[i].oya == node) 15 ko += i; 16 } 17 if (ko.length > 0) { 18 for (var i in ko) { 19 str += hoge(obj, ko[i]); 20 } 21 } 22 return str; 23}

zをzxへ変更すると、'val' of undefinedエラーになります

javascript

1var tree = { 2 piyo : {val : "1", oya : ""}, 3 zx : {val : "2", oya : "piyo"}, 4 b : {val : "3", oya : "zx"},

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

どうも、koを文字列にしてしまっているようです。きちんと配列としてハンドリングすればうまく行きそうです。

// ko += i; ko.push(i);

投稿2016/04/23 04:32

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

re97

2016/04/24 02:00

・回答ありがとうございました
guest

0

ベストアンサー

まず、前提として、for inはオブジェクトを走査するためのステートメントになります。
for hoge in hogesの場合にhogeに代入されるのは、hogesの各キー名となります。
この時、hogesが文字列だった場合は、その文字列のインデックス番号がhogeに代入されることになります。
abcという文字列なら、0, 1, 2という順に代入されます。

では、なぜzをzxにしたらエラーが出るのかの説明をさせていただきます。

var ko = [];
上記の宣言で変数koを配列にしていますが、
続くループ内では、変数ko(配列)への要素の追加ではなく、
文字列の代入になっています。
そのため、変数ko(配列)が変数ko(文字列)になってしまっています。

その結果、続く処理が下記の形になっています。

if (ko.length > 0)
上記は、変数koには1文字以上の文字列が代入されていますので、
tureとなりifブロック内が実行されます。

for (var i in ko)
上記は、配列のループではなく、変数ko(文字列)に対してループを行うため、
変数iに代入されるのは、文字列のインデックス番号になります。
なので、zxの場合は、0、1と代入されていきます。

str += hoge(obj, ko[i]);
上記でko[i]で取得できるのは、zxという文字列ではなく、
zxという文字列のインデックス番号0番目の文字のzのみとなります。

その状態で再度hoge関数が実行され、最初の処理である下記は
obj[node].val;

期待している、obj['zx'].valではなく、
obj['z'].valとなり、objには存在しないため、
エラーとなります。

修正することとしては、maisumakunさんの記載された通り
ko += i;ではなく、ko.push(i);にすれば問題なく動きます。

投稿2016/04/23 08:51

rirazou

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

re97

2016/04/24 02:04 編集

・回答ありがとうございました ・説明大変分かりやすかったです ・参考になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問