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

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

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

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

jQuery

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

Q&A

解決済

2回答

998閲覧

jQueryでeachの連続を避ける方法はありますか?

kata2murin

総合スコア22

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2021/02/12 13:11

###実現したいこと
以下のvar search_menus = {}というオブジェクトは、ユーザーがラジオボタンで選択する内容でローカルストレージに入っている値です。
ラジオボタンなので一つだけtrueの部分が入る予定です。
それを{ color: "red" }と取得したいです。
###該当のソースコード

jQuery

1var search_menus = { 2 "search_page": "comments", 3 "search_filter": { 4 "posts": { 5 "taxi": { 6 "aaa": false 7 } 8 }, 9 "comments": { 10 "color": { 11 "red": true // ユーザーが red のラジオボタンを選択している状態 12 } 13 }, 14 "users": { 15 "airplane": { 16 "aaa": false, 17 "rrr": false, 18 "vvv": false 19 }, 20 "train": { 21 "rrr": false, 22 "ttt": false 23 }, 24 }, 25 } 26};

###試したこと
大変醜くて恐縮なのですが、自分のスキルでは次のようなeachの連続になってしまいます。
もっと良い書き方がございましたら知りたいと考えているのですが、みなさんならどう書きますでしょうか?

jQuery

1var result = getSelectedFilter(search_menus); 2console.log(result); // { color: "red" } が取得できるが、eachの連続がやや醜く感じます 3 4function getSelectedFilter(search_menus){ 5 let result = {}; 6 const search_filter = search_menus.search_filter; 7 $.each(search_filter, function(search_page,obj1){ 8 $.each(obj1, function(content_name,obj2){ 9 $.each(obj2, function(kind,state){ 10 if(state === true){ 11 result[content_name] = kind; 12 } 13 }); 14 }); 15 }); 16 return result; 17}

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

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

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

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

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

kata2murin

2021/02/13 04:01

こちら確認遅れてすみません。特に必須とは考えていませんでした。
guest

回答2

0

ベストアンサー

こんにちは。

再帰を使ってはいかがでしょうか。

js

1function getSelectedFilter(obj){ 2 let result = {}; 3 $.each(obj, function( k, v ){ 4 if( v === true ){ 5 result[k] = v; 6 } 7 if( v instanceof Object ){ 8 Object.assign( result, getSelectedFilter(v) ); 9 } 10 }); 11 return result; 12}

勘違いをしていたようなので追記

上記のコードは返すものを間違っていましたので訂正します。

jQueryが必須でないのであれば、flatMap()が便利です。
Array.prototype.flatMap() - JavaScript | MDN

js

1function getSelectedFilter(obj, key=undefined){ 2 return Object.entries(obj).flatMap( ([ k, v ]) => { 3 if( v === true ){ 4 return {[key]: k}; 5 } 6 if( v instanceof Object ){ 7 return getSelectedFilter(v, k); 8 } 9 return []; 10 }); 11}

投稿2021/02/13 02:35

編集2021/02/13 04:09
Lhankor_Mhy

総合スコア36960

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

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

kata2murin

2021/02/13 03:44

なるほどこういった処理には再帰が便利ですね。そちら使わせて頂きます。どうもありがとうございました。
Lhankor_Mhy

2021/02/13 04:06

少し問題を勘違いしていたようです。 追記します。
kata2murin

2021/02/13 04:31

追記ありがとうございます。そちらだと配列で返るんですね。Object.entriesもflatMapも知らないメソッドで勉強になりました。
guest

0

オブジェクトは、丁寧にkeyを.で繋いでいけばとれます。

js

1console.log(search_menus.search_filter.comments)

これだけだと{ color: "red" }という形にはなりませんが、ヒント程度にはなると思います。

投稿2021/02/12 20:56

m.ts10806

総合スコア80875

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

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

kata2murin

2021/02/13 03:43

すみません。どんなヒントとして活かせるかわかりませんでした。ありがとうございました。
m.ts10806

2021/02/13 04:02 編集

動かしてみれば何が取れるか分かるから、あとは自身で加工すれば良いという話。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問