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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

2回答

1398閲覧

Javascript | filter + arrow関数末尾の[0] とは?

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2019/02/27 02:32

下記コードのArray.prototype.filterの最後にある[0]の意味がわかりません。
これはどういう名称の文法でしょうか。初見の記法でしたので、
お尋ねをさせていただきたいです、ご教授をいただけると幸いです。

const setIsHeaderLabel = (model/*: Sequelize */, columnName/*: string */, value/*: string */) => { if (!value) return; const flag = Object.keys(constant.IS_HEADER_LABEL).filter(k => { return constant.IS_HEADER_LABEL[k] === value; })[0]; model.setDataValue(columnName, flag); };

constant.IS_HEADER_LABEL は下記だとします。

c.IS_HEADER_LABEL = { 1: '付与する', 0: '付与しない', };

宜しくお願いします。

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

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

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

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

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

Lhankor_Mhy

2019/02/27 02:37

普通に添え字ではないかと思うのですが、そういうお話ではなく?
guest

回答2

0

ベストアンサー

ES5ではArray.prototype.filterしか存在しませんでした。
該当するもののうち、先頭のものだけ取り出したい場合は一度filterで配列にしてから[0]というプロパティにアクセスしていました。

ES2015ではArray.prototype.findがあるのでそちらを使いましょう。
アロー関数使ってるのにArray.prototype.findが存在してないってのもありえません。

JavaScript

1const setIsHeaderLabel = (model/*: Sequelize */, columnName/*: string */, value/*: string */) => { 2 if (!value) return; 3 4 // "0" or "1" or undefinedが結果の候補になっちゃう 5 // このundefinedは駄目そう 6 const flag = Object.keys(constant.IS_HEADER_LABEL).find(k => 7 constant.IS_HEADER_LABEL[k] === value 8 ); 9 10 // 意図を考慮するとこの行が抜けてるんじゃないかな? 11 if (flag == null) return; 12 13 model.setDataValue(columnName, flag); 14};

ついでにアロー関数は{}を省略すると1つの式をそのままreturnするのでより自然になります。

投稿2019/02/27 05:04

編集2019/02/27 06:23
miyabi-sun

総合スコア21158

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

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

Lhankor_Mhy

2019/02/27 05:25

constant.IS_HEADER_LABEL[k] === value; が typo です。
miyabi-sun

2019/02/27 07:02

最後の`;`でエラーになりますね。 開発の時はeslinter入れてますが、こういう時はよくやらかすうっかりさんなので助かりました。 ありがとうございます。
Lhankor_Mhy

2019/02/27 07:12

いえ、なんとなく Babel を通してみただけで、そうでなければ私も気づかなかったです。 というか、読み返すと、わかりにくいコメントですね、すみません。
退会済みユーザー

退会済みユーザー

2019/03/01 12:38

ありがとうございます!このコードは基本1つの値しか期待していない関数なのですが、 Array.prototype.filterを用いる以上、配列で返されるので添字[0]を利用することで 値を取得していたことが、ご回答のおかげで把握できました。 またfindの件も、とても勉強になりました。確かにこのコードはArray.prototype.findで 書換をした方がいいですね。 ------------------------------ // 意図を考慮するとこの行が抜けてるんじゃないかな? if (flag == null) return; ------------------------------ これは if(flag==undefined) return; ではなくやはりnullであるべきでしょうか? もしよろしければご教授いただけると幸いです。
miyabi-sun

2019/03/01 13:55 編集

追加講義ということで普段の口調を使うね。 > これは if(flag==undefined) return; ではなくやはりnullであるべきでしょうか? そうだね。 普段JavaScriptで比較演算子を使う場合は`===`を使えと教わるんだけど、 このケースだけは`===`ではなく`==`を使うべきだし、比較するのはnullが最もふさわしい。 理由として、JavaScriptの仕様でundefinedが予約語ではない。 つまりundefinedという変数を宣言して上書きできる小ネタがある。 いやびっくりだよ。 そして==は型変換可能という意味で、nullやundefinedはif文に単体で放り込むとfalseとして扱われる。 https://developer.mozilla.org/ja/docs/Glossary/Falsy なので、`0 == null`や`"" == undefined`は一見trueになりそうなんだけど、 nullやundefinedと==で比較してtrueが返ってくるのは、nullかundefinedのみ。 この仕様があるので、nullとundefined両対応で弾く時は基本的に`if (a == null)`が使われるのだ。 --- ついでに別方向、 `if (!flag) return;`という選択肢も見ていこう。 Object.keys(obj)は必ずStringの配列を返す。 そしてJavaScriptはif文に単体で放り込んだ場合、Boolean型でないものがtrueになるかfalseになるかという変換先が仕様で厳格に決められている。 では問題、Stringの"0"はtrueであるか?それともfalseであるか? これは結構難問だね。正解できたかな? それに比べると、Array.prototype.findが見つからなかったらundefined返すって言ってるんだから素直にundefinedを弾いた方がわかりやすい まず無いだろうけど`Object.keys({"": "taro"})`の場合falseになる値が取れるからバグになるしね。 ``` (undefined => undefined)(1) // 1 <- デベロッパツール上で引数束縛でいけることを確認 Object.keys({"0": "taro"}) // ["0"] Boolean('0') // true Object.keys({"": "taro"}) ```
退会済みユーザー

退会済みユーザー

2019/03/04 03:05 編集

大変為になりました、ありがとうございます。 ■ undefinedが予約語でない点 ■型変換可能==をnullやundefinedで用いる場合、それぞれnullやundefinedでしかtrueにならない点 ■console.log(Boolean('0')); // trueになること ■アロー関数の{}を省略することで、returnを省略できる点など 知らないこと、整理できたことが多くありました、ありがとうございます!
guest

0

filterが配列を返すので、要はarray[0]、つまり配列の最初の要素、です。

投稿2019/02/27 02:36

papinianus

総合スコア12705

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

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

papinianus

2019/02/27 02:41

細かくいうなら まず、Object.keys(constant.IS_HEADER_LABEL)が、[0,1]を返す 次に、[0,1].filter(callback)で、callback内の処理は、ヘッダラベル[0]、ヘッダラベル[1]としたときの値がvalueと同じかを判定。例えばvalueが"付与する"だったら[1]になる。 で、その0番目の要素である、Number(1)が得られる。 処理を全体として見ると、valueで表現される文字列をフラグである値に変換している処理。フラグが数値じゃなくても汎用的に使える構文になっている。
退会済みユーザー

退会済みユーザー

2019/03/01 12:43

ありがとうございます、非常に勉強になりました! 「フラグが数値じゃなくても汎用的に使える構文になっている」 のフラグの部分というのは、 ---------------------------------- c.IS_HEADER_LABEL = { 1: '付与する', 0: '付与しない', }; ---------------------------------- の'1'や'0'の部分を指し、これらが必ずしも数字である必要はないような 設計になっているという認識ですよね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問