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

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

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

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

jQuery

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

Q&A

解決済

2回答

644閲覧

オブジェクトのループに際して、特定キーは例外処理を実装したい

torakun

総合スコア6

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/09/12 04:48

編集2020/09/12 04:51

###実現したいこと
以下の filteredObj というオブジェクトをループし、service, kind, word を入れています。

実現したいことは、 apple か durian の場合は kind を mix として1つだけ入れて、それ以外はそのまま kind を入れて、最終的に resultArr という配列を得ることです。
###該当のオブジェクト、欲しい配列

jQuery

1const filteredObj = { 2 apple : ["a","b"], 3 banana: ["c"], 4 cherry: ["d", "e"], 5 durian: ["f","g"] 6}; 7 8const resultArr = [ 9 { service: "apple", kind: "mix", word: "あ" }, // kind を mix として1つだけ入れる 10 { service: "banana", kind: "c", word: "あ" }, // kind をそのまま入れる 11 { service: "cherry", kind: "d", word: "あ" }, // kind をそのまま入れる 12 { service: "cherry", kind: "e", word: "あ" }, // kind をそのまま入れる 13 { service: "durian", kind: "mix", word: "あ" } // kind を mix として1つだけ入れる 14]; 15

###発生している問題
mix を入れるまではできましたが、1つでいい apple, durian が kind の数ずつ入ってしまうことが避けられません。

###問題のソースコード
mix を入れるまでは問題なく、以下でできました。ですがこれでは apple,durian がその kind の数ずつ入ってしまいます。

jQuery

1const filteredObj = { 2 apple : ["a","b"], 3 banana: ["c"], 4 cherry: ["d", "e"], 5 durian: ["f","g"] 6}; 7 8let postArgs = []; 9$.each(filteredObj, function(service, kinds) { 10 11 kinds.forEach( kind => { 12 13 if( service === 'apple' || service === 'durian' ){ 14 kind = 'mix'; 15 } 16 17 let postArg = {}; // 実際は localStorage.getItem('postArg') で取得するが、テスト用に空を取得しておく 18 postArg.service = service; 19 postArg.kind = kind; 20 postArg.word = 'あ'; 21 console.log( 'postArg =', postArg ); 22 postArgs.push( postArg ); 23 24 }); 25 26}); 27console.log( 'postArgs =', postArgs );

###試したこと
そこで考えたのが、「すでに apple,durian があるかどうかを判定し、ない場合だけ実行する」 という方法です。
以下がその流れになりますが実現できませんでした。

jQuery

1 2let postArgs = []; 3$.each(filteredObj, function(service, kinds) { 4 5 // すでに apple,durian があるかどうかを判定し、ない場合だけ実行する 6 const serviceArr = postArgs.map(v => v.service); 7 if( !serviceArr.includes('apple') && !serviceArr.includes('durian') ){ 8 9 kinds.forEach( kind => { 10 /* 同上 */ 11 }); 12 13 } 14}); 15console.log( 'postArgs =', postArgs );

また、上の if を以下のように逆の発想で実装しようともしてみましたがやはり解決に至らず、質問させていただきたく思います。
宜しくお願い致します。

jQuery

1if( serviceArr.includes('apple') || serviceArr.includes('durian') ) return false;

###バージョン情報
jQuery3.4.1

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

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

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

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

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

guest

回答2

0

apple か durian の場合は、配列に要素1個だけ追加し、それ以外は元の要素数分追加するだけでは。
JQuery を試す環境が無いので、素のJSで書いてますがこんな感じでしょうか。

JavaScript

1const postArgs = Object.keys(filteredObj).reduce((result, key) => { 2 const values = filteredObj[key]; 3 if (key === "apple" || key === "durian") { 4 result.push({ service: key, kind: "mix", word: "い" }); 5 } else { 6 result.push(values.map(v => ({ service: key, kind: v, word: "あ" }))); 7 } 8 return result; 9}, []); 10 11console.log(JSON.stringify(postArgs, null, 2));

投稿2020/09/12 05:34

draq

総合スコア2577

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

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

torakun

2020/09/12 05:44

今回はjQueryでということでしたが、reduceを使いこなせないまま長らく放置していたので勉強になるコードでした。ありがとうございました。
guest

0

ベストアンサー

$.each(filteredObj, function(service, kinds) { if( service === 'apple' || service === 'durian' ){ postArgs.push({ service: service, kind: 'mix', word: 'あ' }); } else { kinds.forEach( kind => { postArgs.push({ service: service, kind: kind, word: 'あ' }); }); } });

ということでしょうか。

投稿2020/09/12 05:33

編集2020/09/12 05:33
unhappychoice

総合スコア1531

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

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

torakun

2020/09/12 05:42

そう分岐すればよかったんですね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問