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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

6026閲覧

jsのfilter()の第二引数が何をしているのかよくわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2019/05/20 07:31

調べたところfilterの第二引数は配列のインデックス番号を入れるようですが、以下のコードのfilter(,this);がなんなのかよくわかりません。
どうしてthisを使わないといけないのでしょうか?

HTML

1<!DOCTYPE html> 2<html> 3 <head> 4 <title>Vue.js sample</title> 5 <meta charset="utf-8"> 6 <link rel="stylesheet" href="style.css" > 7 <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script> 8 </head> 9 <body> 10 <div id="app"> 11 <input v-model="findWord"> 12 <ul> 13 <li v-for="item in findItems"> {{ item }}</li> 14 </ul> 15 </div> 16 17 <script> 18 new Vue({ 19 el: '#app', 20 data: { 21 findWord: '', 22 items:['桃太郎','花咲か爺さん','浦島太郎','かぐや姫','かちかち山'] 23 }, 24 computed: { 25 // this.findWordが変わったら、その文字が含まれるリストを算出する 26 findItems: function() { 27 if (this.findWord) { 28 return this.items.filter(function(value) { 29 return (value.indexOf(this.findWord) > -1); 30 },this); 31 } else { 32 // this.findWordが空のときは、リストをそのまま返す 33 return this.items; 34 } 35 } 36 } 37 }) 38 </script> 39 </body> 40</html> 41

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

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

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

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

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

guest

回答3

0

ベストアンサー

functionキーワードで作った関数を実行した際、
関数の中身ではthisが再定義されます。

JavaScript

1return this.items.filter(function(value) { 2 return (value.indexOf(this.findWord) > -1); 3},this);

この中では確かに.filter(function(){})という感じで
functionを使って関数を定義していますね。
なのでthis.findWordと比較しようとしても、「は?お前何いってんの?thisにfindWordなんてあるわけねーだろ!」と叱られてしまいます。

まぁその回避の為に.filter()メソッドの第二引数にthis制御用の引数が定義されています。


IE11を見捨てて良いならES2015というバージョンで実装されたアロー関数を使えば問題ありません。
アロー関数にはargumentsやthisを再定義するという(邪魔になりうる)機能は存在しませんので、そのまま利用出来ます。

if文の使い方から若干シンプルにできそうなので多少リファクタリングして、
ES2015の書き方で統一するとこんな感じですね。
慣れない内は中々キモいですが行数が相当抑えられて読み書きしやすいコードになっています。

JavaScript

1new Vue({ 2 el: '#app', 3 data: { 4 findWord: '', 5 items:['桃太郎','花咲か爺さん','浦島太郎','かぐや姫','かちかち山'] 6 }, 7 computed: { 8 findItems () { 9 if (!this.findWord) return this.items; 10 return this.items.filter(value => 11 value.indexOf(this.findWord) > -1 12 || this.findWord.indexOf(value) > -1 // こんな風に双方向の方がよくね? 13 ); 14 } 15 } 16})

投稿2019/05/20 08:29

miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2019/05/21 05:31

回答ありがとうございます。わかりやすかったです!! ES2015の書き方もきちんと学習しようと思います。回答ありがとうございました。
guest

0

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

thisArg Optional
callback を実行するときに this として使う値です。

これですね。

ES6の書き方だと、アロー関数が適するシーンですね。

js

1 return this.items.filter((value) => { 2 return (value.indexOf(this.findWord) > -1); 3 });

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Description

2 つの理由から、アロー関数が導入されました。1 つ目の理由は関数を短く書きたいということで、2 つ目の理由は this を束縛したくない、ということです。

投稿2019/05/20 08:24

otolab

総合スコア765

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

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

退会済みユーザー

退会済みユーザー

2019/05/21 05:32

回答ありがとうざいます!!
guest

0

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Parameters

Callbackの第2引数は、フィルタしている配列のthisですが、filterの第2引数は、Callbackでthisとして使いたいものです。

この場合、filterするための検索キーの指定に使っていますよね

javascript

1 findItems: function() { 2 if (this.findWord) { 3 return this.items.filter(function(value) { 4 return (value.indexOf(this) > -1); 5 },this.findWord); 6 } else { 7 // this.findWordが空のときは、リストをそのまま返す 8 return this.items; 9 } 10 }

とかでも動くとは思いますが、どういうかたちであれ、キーを外から貰う必要はありますよね

投稿2019/05/20 07:45

papinianus

総合スコア12705

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

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

退会済みユーザー

退会済みユーザー

2019/05/21 05:33

回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問