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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

4回答

9460閲覧

$.each() から抜けると同時にメソッドからも抜けるにはどうすればいいのでしょう?

yonaO

総合スコア13

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/04/07 02:15

やりたいこと

$.each() のループ内にて、特定条件で"return false" すると、$.each() から抜けることはできるがメソッドから抜けることができない
抜ける場合には、$.each() 内でフラグを立てて抜ける方法しか思いつきませんでした。
なにかスマートに抜ける方法はありますか?

下記のコードで"callMethod()" から抜けるようにしたいです

js

1$(function() { 2 callMethod() 3}) 4 5let callMethod = () => { 6 let arr = [1,2,3,4,5] 7 console.info('enter: callMethod') 8 $.each(arr, (i,e) => { 9 console.info(e) 10 if (e === 3) return false 11 }) 12 console.info('leave: callMethod') 13}

上記のコードだと、console.info('leave: callMethod') が表示されてしまう。
$.each() 内の、"e===3"の時には**console.info('leave: callMethod')**が表示されないようにしたいです。

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

他の回答者さんの様に例外やフラグ変数で逃げる手法で意図した挙動になるでしょう。

しかし、そもそも$.each()でやること自体が誤りの始まりです。
eachというのは**配列の要素全てに同じ処理を行う(戻り値は問わない)**リスト操作関数だからです。
特定の何かが出たら逃げる…これで正しいのでしょうか?

jQueryのリスト操作は不完全なので、Underscore.jsもしくは、速度面でより洗練されたlodash.jsを利用してください。

そのfindを利用すれば下記のように書く事が出来ます。

JavaScript

1let callMethod = () => { 2 let arr = [1,2,3,4,5] 3 console.info('enter: callMethod') 4 5 // Add: ここから 6 let is_skip = _.find(arr, (it) => { 7 return it !== 3 8 }) 9 if (is_skip) return 10 // Add: ここまで 11 12 $.each(arr, (i,e) => { 13 console.info(e) 14 }) 15 console.info('leave: callMethod') 16}

特定のダメな奴が見つかるまで、何かしらの処理をさせたければ_.findIndex_.takeを組み合わせて実現出来るはずです。

投稿2017/04/07 03:18

miyabi-sun

総合スコア21158

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

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

yonaO

2017/04/07 03:56

miyabi-sunさん ご回答ありがとうございます。 今後、同様の処理が増えた時には、lodash.js を使用して、find() を使ったやり方も視野に入れていきたいです.
guest

0

抜ける場合には、$.each() 内でフラグを立てて抜ける方法しか思いつきませんでした。

それ以外に無いと思います。


追記:

例外は思いつかなかったです、おもしろい。
そもそも事前にチェックしておけばよいような。

JavaScript

1let arr = [1,2,3,4,5]; 2if ( arr.some( e => { return (e === 3); } ) ) return;

【Array.prototype.some() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some

投稿2017/04/07 02:37

編集2017/04/07 03:36
kei344

総合スコア69398

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

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

yonaO

2017/04/07 03:53

kei344さん ご回答ありがとうございます。 事前チェックありですね〜 今回の場合、メソッド内で this を使用したので、今回は try~catch を使います! some() は知らなかったので、事前チェックの際には使っていきたいです。
yonaO

2017/04/07 04:23

言葉足らずでした.すみません. jQuery で取得した値をもとに each 内で処理しているので今回の場合のように1行で書くことができなくなり、変数が必要になってしまので、今回は try~catch を使うことにします. some() と $.inArray() の使い分けが難しいです... some() も積極的に使っていきたいですね.
kei344

2017/04/07 05:12

> some() と $.inArray() の使い分けが難しいです $.inArray() は ArrayにindexOf すら無かった時代に jQuery に実装され、現状に合わせて進化はしていますがそういうメソッドです。対応ブラウザが IE9+ であれば some() など新し目のものを使えば良いと思います。
yonaO

2017/04/07 05:36

なるほど、勉強になります。 ありがとうございます!
guest

0

ベストアンサー

例外処理でにげてみては?

javascript

1$(function(){ 2 let arr = [1,2,3,4,5]; 3 console.info('enter: callMethod'); 4 try{ 5 $.each(arr, (i,e) => { 6 console.info(e); 7 if (e === 3) throw true; 8 }); 9 }catch(e){ 10 return false; 11 } 12 console.info('leave: callMethod'); 13}); 14

修正

質問にあわせ関数の形にしておきました
なお、ループから抜けてdoneを表示したあと抜けるにはfinallyを利用ください

javascript

1<script> 2$(function() { 3 callMethod() 4}) 5let callMethod = () => { 6 let arr = [1,2,3,4,5]; 7 console.info('enter: callMethod'); 8 try{ 9 $.each(arr, (i,e) => { 10 console.info(e); 11 if (e === 3) throw true; 12 }); 13 }catch(e){ 14 return false; 15 }finally{ 16 console.info('done: callMethod'); 17 } 18 console.info('leave: callMethod'); 19} 20 21</script> 22

投稿2017/04/07 02:32

編集2017/04/07 02:53
yambejp

総合スコア114742

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

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

yonaO

2017/04/07 03:50

yambejpさん ご回答ありがとうございます。 try~catch は、思いつきませんでした。 フラグのために、変数を定義したくなかったのでこの方法で実装したいとおもいます。 助かりました!!
guest

0

jQuery.each(arr, func) は、arr のそれぞれに対して func を適用します。
つまり、

JavaScript

1function func() {...} 2 3$.each(arr, func);

と書いているのと同じです。であれば、func の中で return したところで、each に(そしてさらに上位にも)影響を与えないことは理解できるかと思います。

each ループを飛び越えて影響を与えるためには、

  • フラグ変数を介して状態を伝える
  • 例外を生成して上位に伝える

ということになるわけです。

投稿2017/04/07 03:19

tacsheaven

総合スコア13703

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

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

yonaO

2017/04/07 03:57

tacsheavenさん ご回答ありがとうございます。 今回は、例外を生成して上位に伝える 方法で実装することにしました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問