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

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

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

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

Q&A

解決済

4回答

709閲覧

JS(ES6含む)での深い連想配列の変数チェック

ar3qna

総合スコア14

JavaScript

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

3グッド

10クリップ

投稿2019/01/22 07:25

以下のような場合、もっとシンプルにかけないものでしょうか?

var info = { "aaa":{ "bbb":{"ccc":1} } } if(info.aaa.bbb.ccc==1){ //ここに処理を書く }

ここで info.aaa.bbb.ccc==1のチェックするためには、

if(info && info.aaa && info.aaa.bbb && info.aaa.bbb.ccc && info.aaa.bbb.ccc==1)

とキーごとに存在チェックを書いていかなければならないのでしょうか?

phpでいうと、

if(empty($info['aaa']['bbb']['ccc'])==false && $info['aaa']['bbb']['ccc']==1)

のようにキーの存在チェックは一気にできますが、JSではできないのでしょうか?

ES6を使ってbabelで es2015に変換して使っていますので、ES6ならシンプルに書けるならそれでも結構です。

set0gut1, jun68ykt👍を押しています

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

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

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

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

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

guest

回答4

0

前半がnullundefinedならそのままスルーされる?.演算子が「Optional Chaining」として、追加を提案中の段階です(tc39/proposal-optional-chaining)。Babelではプラグインを入れれば使うことも可能です。

javascript

1if(info?.aaa?.bbb?.ccc==1){ 2//ここに処理を書く 3}

投稿2019/01/22 07:37

maisumakun

総合スコア145183

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

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

ar3qna

2019/01/22 07:41

おー!素晴らしいですね!これ試してみたいと思います。
guest

0

ベストアンサー

こんにちは。

ご質問のような状況のとき、個人的によく使う手としては、info が持っているべきプロパティのデフォルト値という意味合いのオブジェクトを定義しておいて、Lodash の _.defaultsDeep によって、対象オブジェクトに足りないプロパティをそのデフォルト値を集めたオブジェクトから追加することです。

例えば、以下のように DEFAULT_INFO を用意しておきます。

javascript

1const DEFAULT_INFO = { 2 aaa: { 3 bbb: { ccc : 0, }, 4 bbb2: { ccc2 : 0, }, 5 }, 6};

その上で、DEFAULT_INFO の持つプロパティの一部は持っているかもしれないけれども、すべてを持っているかどうかは分からないオブジェクトを参照している変数 info があった場合に、これを使う前に

javascript

1_.defaultsDeep(info, DEFAULT_INFO);

とします。そうすると、 DEFAULT_INFO にはあって、info には無いプロパティを、infoに追加してくれて、かつ、DEFAULT_INFOinfo の両方にあるプロパティはDEFAULT_INFOの値で上書きしない、ということをやってくれます。

たとえば、info{ aaa: { bbb2: { ccc2: 1 } } } が入っていたときに、
_.defaultsDeep(info, DEFAULT_INFO);
をやっておくと、以下のようになります。

javascript

1console.log(info.aaa.bbb2.ccc2); // => 1 2console.log(info.aaa.bbb.ccc); // => 0

投稿2019/01/22 18:11

jun68ykt

総合スコア9058

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

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

ar3qna

2019/01/22 18:43

ありがとうございます!Lodash初めて知りました。美しい解決方法ですね。素晴らしいです!ただ、今回のは一切の外部jsが使えなくてJQuery相当のものも最低限の処理を自前で作っていることもあってこの方法だといけないのですが、外部JS使えるところではぜひこちらの方法を参考にさせていただきます。ありがとうございました。
jun68ykt

2019/01/22 18:54

どういたしまして。Lodash、お勧めですよ。
guest

0

先日全く同じ趣旨の質問がありましたね。
Javascript Objectのプロパティの存在チェックについて

babel使っているとのことなので、proposal-optional-chainingで一撃ですが、
ESLintとかが上手く動かないようならLodashやRamda.jsを検討しても良いかもしれません。

投稿2019/01/22 07:42

miyabi-sun

総合スコア21158

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

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

ar3qna

2019/01/22 18:46

ありがとうございます。こちらの質問を見つけられていませんでした。同じことでしたね。先の人に教えていただいたproposal-optional-chainingをインストールして動かそうとしてみたのですが、babel7をうまく動かせなくて、チェックする関数を作って対応しました。せっかくbabel使ってるんだからそういう部分は任せてしまいたかったんですが、落ち着いたらbabelでもトライしてみたいと思います。ありがとうございました。
guest

0

チェックする関数を作ってそれを呼び出すと良いのではないでしょうか。

投稿2019/01/22 07:30

m.ts10806

総合スコア80850

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

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

ar3qna

2019/01/22 07:41

すごくごもっともですね。なぜそれをかんがえつかなかったのか情けない。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問