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

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

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

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

Q&A

3回答

2883閲覧

JavaScript [for文の中にif文]の処理と[コールバック関数のfilterメソッド]の処理の違いについて

kwiyy

総合スコア12

JavaScript

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

0グッド

0クリップ

投稿2020/03/17 14:42

編集2020/03/17 15:54

JavaScriptの勉強を最近はじめた入門者です。

for文の中で使うif文とコールバック関数で使うfilterって同じ処理ができると思うんですが、この二つの違いがわかりません。
書き方が違うとか、そういう意味ではなく「何で同じ処理ができるのに別の方法があるんだ?」って意味です。
今回思い浮かんだ例題コードが簡単な物しかないんですが、
実際の開発現場ではどういう使い分けや使い方をされるんですか??

初心者なんで下記見たいなコードのイメージしかないんで申し訳ないです…

JavaScript

1const members = [ 2 {name:"Taro",age:24}, 3 {name:"Goro",age:25}, 4 {name:"Takeshi",age:24} 5]; 6 7for(let i=0; i < members.length; i++){ 8 if(members[i].age === 24){ 9 console.log(members[i]); 10 } 11} 12 13//コンソールに表示される結果 14//{name:"Taro",age:24} 15//{name:"Takeshi",age:24}

JavasCript

1const members = [ 2 {name:"Taro",age:24}, 3 {name:"Goro",age:25}, 4 {name:"Takeshi",age:24} 5]; 6const filterMembers = members.filter((member)=>{ 7 8 return member.age === 24; 9 10}); 11 12console.log(filterMembers); 13 14//コンソールに表示される結果 15//{name:"Taro",age:24} 16//{name:"Takeshi",age:24} 17

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

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

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

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

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

kei344

2020/03/17 14:45

どちらのコードもエラーが出るので、まずエラーが出ない例を提示してください。
kwiyy

2020/03/17 15:50

失礼しました。 修正できました!どちらもビルドできたので回答よろしくお願いします。
kwiyy

2020/03/17 15:51

あ、すみません。やっぱりもう一度修正します。
kwiyy

2020/03/17 15:54

直しました!
guest

回答3

0

何で同じ処理ができるのに別の方法があるんだ?

filterやmapといった機能は関数型プログラミングの高階関数の考え方です。
JavaScriptだけではなくPHPRubyPythonにもあります。

関数型流行ってるからね、しょうがないね。

実際の開発現場ではどういう使い分けや使い方をされるんですか?

可読性という観点で「お前ら基本的にはfor文を使うな!」という現場は存在します
(JavaScriptでこれを採用している現場なんて、ウィザードを大量に抱えたイケイケの会社以外ないと思いますが)

どういうことかと言うとforという意味には繰り返しという意味しかありません。
だからコードリーディングに於いてfor文を見たらエンジニアは身構える事になり、
脳のリソースを多く消費することになります。

逆に高階関数にはこういう意味合いが付属します。

  • filter: 戻り値は配列、各要素の値や型は保持される
  • map: 戻り値は配列、要素数は保持される、各要素の値が加工される
  • forEach(each): 処理だけ行う、戻り値は使わず捨てる、実質結果を捨てるfor文
  • reduce(fold): 配列から統合した一つの値を取り出す、実質結果付きのfor文

各項目は英語の数学用語からきています。
filterはまんまフィルターですし、mapは地図ではなく写像。

最初に「やりたいこと」を宣言してから操作に移行するので、
慣れているエンジニアにとっては非常に読みやすいコードとなります。
デバッグのフェイズに於いて「なーんだ、ここはfilterなのか、なら今回の不具合とは関係なさそうだし読み飛ばしても大丈夫だな」という判断もできます。

例えば質問文のコードはfilterで出来る1個の事だけでしたが、
「ユーザー一覧から年齢24歳の名前の配列を取り出したい」という風に
もっと複雑な要望にしていくと高階関数の良さが現れてきます。

コードにするとこんな感じ。

js

1const members = [ 2 {name: "Taro", age: 24}, 3 {name: "Goro", age: 25}, 4 {name: "Takeshi", age: 24} 5]; 6 7// for文を使う場合はfor文にやりたい事を全て詰め込む 8const results1 = []; 9for (const member of members) { 10 if (member.age === 24) { 11 results1.push(member.name); 12 } 13} 14console.log(results1); // ["Taro", "Takeshi"] 15 16// filterやmapを使うと1行完結になる 17const results2 = members 18 .filter(member => member.age === 24) 19 .map(member => member.name); 20console.log(results2); // ["Taro", "Takeshi"]

カッコの対応が1行で終わるので、
やりたいことが複雑になればなるほど得をするのがこの高階関数的な解決方法です。
まぁ、JavaScriptのArrayのメソッドはとても貧弱なので
実務ではLodashライブラリのチェーン記法を使う事をおすすめします。

Lodashは値の加工という点に於いて、
思いつくあらゆる事を全部実現出来るんじゃないかというレベルの柔軟性があります。
例えば集計する時にgroupByは非常に便利ですが、他の言語の関数やライブラリとして同じ名前で用意されてたりしますので、長い目で覚えておくとお得だと思います。

投稿2020/03/18 03:37

miyabi-sun

総合スコア21194

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

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

0

filterはES5(JavaScriptのバージョン)から使えるようになったメソッドです。

以前はifで書くしかなかった処理が、filterのおかげで書きやすく、且つわかりやすく表現できるようになりました。

ただし、ifでできる全てのことをfilter で置き換えるものではなく、あくまで
「配列にオブジェクトがたくさん入っている時に、ある特定の特徴を持つオブジェクトだけに絞った配列を再度作る」という処理を書きたい場面で使用します。

こういう場面は多々あるので、
filter が追加されたのだと思います。

投稿2020/03/17 16:15

webdev-koara

総合スコア75

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

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

0

forで判定処理したら別の配列にいれないとfilter相当になりません
for以外の複数の機能を合わせた処理がfilterだと考えればよいでしょう
逆にfilterではforを代替することはできませんので
お互い補完し合う関係です

投稿2020/03/18 00:26

yambejp

総合スコア116468

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問