javascriptを用いて、入れ子構造(?)になっている配列から特定の文字列が含まれる単語を見つけるコードを書いています。
実行場所はchromeです。
をhtmlファイルの冒頭に記載しています。
正規表現を用いて、'.3'が含まれる(..3.)単語を探しています。
以下のコードを試しており、4.3.1,4.3.2,4.3.2,4.4.3の時に"if後は"が含まれる文章をconsoleさせようとしています。
javascript
1var dotfour = ['4.4.1','4.4.2','4.4.3']; 2var dotthree = ['4.3.1','4.3.2','4.3.3']; 3var four = ['4.1','4.2',dotthree,dotfour,'4.5']; 4var array = ['1','2','3',four,'5']; 5 6function test_list(array,loop) { 7 var test_reg = new RegExp('.3' , 'g'); 8 array.forEach(function (list,index) { 9 console.log(list,loop); 10 if (typeof list === "object"){ 11 if (loop === 1){ 12 test_list(list,loop + 1); 13 }else if(loop === 2){ 14 test_list(list,loop +1); 15 } 16 }else if(typeof list === "string"){ 17 console.log(list + 'の時、if前は' + test_reg.test(list.toLocaleLowerCase())); 18 if (test_reg.test(list.toLocaleLowerCase())){ 19 console.log(list + 'の時、if後は' + test_reg.test(list.toLocaleLowerCase())); 20 } 21 } 22 }); 23 if (loop === 1){ 24 console.log('end'); 25 } 26} 27$(function () { 28 test_list(array,1); 29});
しかし、結果は、
javascript
11 1 21の時、if前はfalse 32 1 42の時、if前はfalse 53 1 63の時、if前はfalse 7(5) ["4.1", "4.2", Array(3), Array(3), "4.5"] 1 84.1 2 94.1の時、if前はfalse 104.2 2 114.2の時、if前はfalse 12(3) ["4.3.1", "4.3.2", "4.3.3"] 2 134.3.1 3 144.3.1の時、if前はtrue 154.3.2 3 164.3.2の時、if前はtrue 174.3.3 3 184.3.3の時、if前はtrue 194.3.3の時、if後はfalse 20(3) ["4.4.1", "4.4.2", "4.4.3"] 2 214.4.1 3 224.4.1の時、if前はfalse 234.4.2 3 244.4.2の時、if前はfalse 254.4.3 3 264.4.3の時、if前はtrue 274.5 2 284.5の時、if前はfalse 295 1 305の時、if前はfalse 31end
というようになります。
"if前はtrue"と記載されている部分で、trueと表記するのと同じ"test_reg.test(list.toLocaleLowerCase())"をifの条件にしているのに、そのifの中にあるconsoleを実行していない部分があります。
しかし、コードの一部分を
javascript
1}else if(typeof list === "string"){ 2 var test_result = test_reg.test(list.toLocaleLowerCase()); 3 console.log(list + 'の時、if前は' + test_result); 4 if (test_result){ 5 console.log(list + 'の時、if後は' + test_reg.test(list.toLocaleLowerCase())); 6 } 7 }
に変更すると、(正規表現による探索結果を変数に代入し、その変数を利用するようにしています。ifの中は正規表現による結果をそのままconsoleする設定です。)
javascript
14.3.1 3 24.3.1の時、if前はtrue 34.3.1の時、if後はfalse 44.3.2 3 54.3.2の時、if前はtrue 64.3.2の時、if後はfalse 74.3.3 3 84.3.3の時、if前はtrue 94.3.3の時、if後はtrue
というように、if内に入る流れは想定通りの実行がなされます。
しかし、if内部では、元々trueだった探索結果がfalseになっています。
つまり、else if内でtest_reg.test(list.toLocaleLowerCase())の結果がif前後で変化しているのですが、これはなぜでしょうか。理由がわかりません。
forEachで他の要素を参照して、listが書き換えられてしまって結果が変わってしまったのかとも思っていますが、forEachの仕様のページ(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/foreach)を確認してもそのような、各要素を見ている途中に他の要素に飛ぶというような記載を見つけることができませんでしたし、listの値は変更されていない(if前とif後で参照している数字が変わっていない)ので、そうではないと思います。
実装としては変更後のやり方で目的は達成できるので良いのですが、気になるので、教えていた開けると嬉しいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/15 08:01