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

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

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

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

Q&A

解決済

3回答

431閲覧

JavaScript: 配列の要素を一つずつ返したい

Ykkykk

総合スコア140

JavaScript

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

0グッド

0クリップ

投稿2020/01/10 02:15

配列の要素を一つずつ返したいのですが、

Uncaught RangeError: Maximum call stack size exceeded

というエラーが出てしまいます。調べた限りだと関数内で別の関数を再帰的に呼び出すようにしていることからスタックが溢れてしまい出ているエラーだということがわかりました。

JavaScript

1var getData = function(){ 2 var buff = ['aaaa', 'bbbbb', null]; 3 for (var i = 0; i < buff.length; i++){ 4 return buff[i]; 5 }; 6  buff.shift(); 7}; 8var setData = function(){ 9 var buff = getData(); 10 if (buff != null){ 11 console.log(buff); 12 setData(); 13 } else { 14 console.log(buff); 15}; 16setData();

array.shift()メソッドで先頭要素を削除すれば良いのかと思い、上記コードではそのようにしていますが、同じエラーが出てしまいました。
どのように修正すればうまく要素を一つずつ返すことができるのでしょうか?
ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

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

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

Masakin

2020/01/10 02:32

このコードだと'aaaa'を出力して無限ループするかと思うのですが、 理想の出力結果の追記をお願いします。
Ykkykk

2020/01/10 02:33

aaa bbbbb null のように配列の要素をsetData内で一つずつ取得し、nullが来たらsetDataを抜けるというような動きをしたいです。
BluOxy

2020/01/10 02:39

setDataを用意する必要はあるのでしょうか。
guest

回答3

0

ベストアンサー

原因

getDataは常にbuff[0]しか返さないので、setDataの関数内の条件buff != nullは常に真と評価されます。
常に真だと、常に再帰的にsetDataを呼び出すことになるので、該当のエラーが発生します。

また、setDataというものの、内部ではbuffの要素を取得してconsole.logで出力するという、setではない処理が記述されているので、混乱の元になります。

解決策

aaa

bbbbb
null
のように配列の要素をsetData内で一つずつ取得し、nullが来たらsetDataを抜けるというような動きをしたいです。

単純に1つずつ返したいならsetDatagetDataという関数を用意するのではなく、

javascript

1const array = ['aaaa', 'bbbbb', null]; 2for(const element of array){ 3 console.log(element); 4 if(element === null){ 5 break; 6 } 7}

で良いように思いますが、いかがでしょうか。
実装はなるべく必要最小限に、かつシンプルさを保たないと混乱の元になります。

投稿2020/01/10 02:44

BluOxy

総合スコア2663

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

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

Ykkykk

2020/01/10 02:46

ご回答いただきありがとうございます。 私もそのように一つの関数でやり直してみたところ正常に返すことができました。 本当にありがとうございます!
guest

0

array.shift()メソッドで先頭要素を削除すれば良いのかと思い、上記コードではそのようにしていますが、同じエラーが出てしまいました。

var buff = ['aaaa', 'bbbbb', null];は、getDataを実行するたびに初期化されます。なので、shiftしても、次にgetDataを呼び出したときにはもとに戻っています。

どのように修正すればうまく要素を一つずつ返すことができるのでしょうか?

buffgetDataの外側で定義するのが手っ取り早いかと思います。

投稿2020/01/10 02:18

maisumakun

総合スコア145183

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

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

Ykkykk

2020/01/10 02:25

ご回答いただきありがとうございます。 var buff = ['aaaa', 'bbbbb', null]; var getData = function(){ for (var i = 0; i < buff.length; i++){ return buff[i]; };   buff.shift(); }; var setData = function(){ var buff = getData(); if (buff != null){ console.log(buff); setData(); } else { console.log(buff); }; setData(); 上記のように変更したのですが、同様のエラーが出てしまいました。。 何が問題なのでしょうか。。。
guest

0

まず、インデントに全角スペースを使っている箇所があります。やめてください。
次にsetDataがきちんと閉じられていません。閉じてください。
その上で、実行すると無限ループしています。

投稿2020/01/10 02:25

yambejp

総合スコア114784

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

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

yambejp

2020/01/10 02:25

全体的に何をやりたいかわかりません、仕様をはっきりさせてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問