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

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

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

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

jQuery

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

Q&A

解決済

3回答

2172閲覧

多次元配列から指定キーの配列を取得したい

narutona

総合スコア23

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2019/05/31 08:16

前提・実現したいこと

JavaScript、jQueryで、多次元配列から指定キーの配列を取得したいです。
宜しくお願い致します。

発生している問題・エラーメッセージ

「試したこと」にあるように、JavaScriptとjQueryと試した結果、以下のエラーとなります。

まずJavaScriptの方ではundefinedです。

undefined

そしてjQueryの場合のエラーは、日付の指定がわからずこちらです。

v['d{4}/d{2}'] is undefined

該当のソースコード

元になる配列です。
おおまかには、「月の下にidとuxが並ぶ」という構造です。
これを一番下の配列ごとに取得し、それぞれ「hoo()」をかけたいと思っています。

js

1var array = { 2 "postA":{ 3 "2019/05":[ 4 {"id":1,"ux":a}, 5 {"id":2,"ux":b} 6 ], 7 "2019/04":[ 8 {"id":3,"ux":c} 9 ] 10 }, 11 "postB":{ 12 "2019/05":[ 13 {"id":4,"ux":d}, 14 {"id":5,"ux":e} 15 ] 16 } 17}; 18 19function hoo(data){ 20 $('body').append('<p>'+data['id']+'</p>と<p>'+data['ux']+'</p>'); 21}

試したこと

以下、エラーの出るコートです。

まずJavaScriptでforを使ってみたのですが、上のように「undefined」となってしまいます。

js

1for (let key in array) { 2 for (let k in key) { 3 const data = { 4 id: k.id, 5 ux: k.ux 6 }; 7 hoo(data); 8 } 9}

続いてjQueryのeachを使ってみたものの、不確定な日付をどう指定すればいいかわからず、正規表現を使ってみましたが上のエラーになってしまいました。

jqeury

1$.each(array, function(i, v) { 2 const data = { 3 id: v['\d{4}/d{2}']['id'], 4 ux: v['\d{4}/d{2}']['ux'] 5 }; 6 hoo(data); 7});

補足情報(FW/ツールのバージョンなど)

「hoo()」がかかった状態として最終的に想定している出力は次のものです。
よろしければこの出力にすべく正しいソースコードをご教授願えませんでしょうか。

html

1 2<p>1とa</p> 3<p>2とb</p> 4<p>3とc</p> 5<p>4とd</p> 6<p>5とe</p> 7

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

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

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

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

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

guest

回答3

0

javascript

1var array = { 2 "postA":{ 3 "2019/05":[ 4 {"id":1,"ux":"a"}, 5 {"id":2,"ux":"b"} 6 ], 7 "2019/04":[ 8 {"id":3,"ux":"c"} 9 ] 10 }, 11 "postB":{ 12 "2019/05":[ 13 {"id":4,"ux":"d"}, 14 {"id":5,"ux":"e"} 15 ] 16 } 17}; 18 19Object.keys(array).reduce((a,c)=>a.concat(Object.keys(array[c]).flatMap(e=>array[c][e])),[]).forEach(hoo);

投稿2019/05/31 08:32

papinianus

総合スコア12705

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

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

papinianus

2019/05/31 08:34

そうか、一旦目的の配列を作る必要ないですよね
yambejp

2019/05/31 08:48

IEを想定するならObject.valuesよりkeysの方が選択肢としては正しいです
narutona

2019/05/31 08:51

申し訳ございません。確認が遅くなりました。 みなさん複雑でちょっとついていけなかったです。階層が多いいとこんなになるんですね。 ありがとうございました。こちらのソースコードもじっくり拝読させて頂きたいと思います。
papinianus

2019/05/31 09:02

複雑ってことですが何なら複雑じゃないのでしょうか。 使える構文を縛ってください。それで書きますので。
papinianus

2019/05/31 09:03

ieは考えてないです。flatMapとか無理そうですし。
narutona

2019/05/31 09:30

お気遣いありがとうございます。構文を縛るとしても「何で縛ると可能なのか」などがわからず。たとえるならマグロの釣り方を知りたいときに「どの釣り竿ならわかるの?」と聞かれ、「どの釣り竿ならマグロが釣れるのかわからない」といった感じです(笑) さらに現状としては結局自分の環境で実装できず、何がいけないのか再考していたりもするので、しばしお時間いただければと思います。
guest

0

ベストアンサー

オブジェクトにarrayという変数名をつけるのは紛らわしいので
やめたほうがよいでしょう

javascript

1<script> 2$(function(){ 3 var obj = { 4 "postA":{ 5 "2019/05":[ 6 {"id":1,"ux":"a"}, 7 {"id":2,"ux":"b"}, 8 ], 9 "2019/04":[ 10 {"id":3,"ux":"c"}, 11 ], 12 }, 13 "postB":{ 14 "2019/05":[ 15 {"id":4,"ux":"d"}, 16 {"id":5,"ux":"e"}, 17 ], 18 }, 19 }; 20 Object.values(obj).forEach(x=>{ 21 Object.values(x).forEach(y=>{ 22 y.forEach(data=>{ 23 $('body').append('<p>'+data.id+'と'+data['ux']+'</p>'); 24 }); 25 }); 26 }); 27}); 28</script>

hooにわたす

hooに渡しても直に書いても同じです。
なお命題のhooはpタグが別れていて仕様がおかしいです
(pが別れていると補足情報のサンプルのようにはならない)

javascript

1$(function(){ 2 var obj = { 3 "postA":{ 4 "2019/05":[ 5 {"id":1,"ux":"a"}, 6 {"id":2,"ux":"b"}, 7 ], 8 "2019/04":[ 9 {"id":3,"ux":"c"}, 10 ], 11 }, 12 "postB":{ 13 "2019/05":[ 14 {"id":4,"ux":"d"}, 15 {"id":5,"ux":"e"}, 16 ], 17 }, 18 }; 19 Object.values(obj).forEach(x=>{ 20 Object.values(x).forEach(y=>{ 21 y.forEach(data=>{ 22 hoo(data); 23 }); 24 }); 25 }); 26}); 27function hoo(data){ 28 $('body').append('<p>'+data['id']+'と'+data['ux']+'</p>'); 29}

蛇足

javascript

1 $.each(obj,(...x)=>{ 2 $.each(x[1],(...y)=>{ 3 y[1].forEach(hoo); 4 }); 5 });

投稿2019/05/31 08:27

編集2019/05/31 09:14
yambejp

総合スコア114843

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

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

narutona

2019/05/31 08:37 編集

まず名称についてありがとうございます。連想配列とは、配列ではなくオブジェクト(?)なのでしょうか? また、大っ変申し訳ございませんが、あくまで「hoo()」を使った流れで考えております。つまり「const data」にそれぞれの値を配列として入れておき、それを「hoo()」に渡す。という過程を経て実現したいと考えておりました。素人的な思考でしょうし恐れ多いのですが。 とはいえ大変勉強になる書き方に感謝申し上げます。
yambejp

2019/05/31 08:45

> 連想配列とは、配列ではなくオブジェクト javascriptに連想配列という考え方はありません。 配列ではないのでデータアクセスの仕方が変わってきます (forでやるならinで受ける)
narutona

2019/05/31 08:48

失礼致しました。初めて見る形式でしたので応用を利かせられませんで、たびたびお手間おかけしました。無事実装できました。ご回答いただきありがとうございました。
narutona

2019/05/31 08:49

> javascriptに連想配列という考え方はありません。 お恥ずかしながらまったく知りませんでした。ありがとうございます。よく調べておきます。
papinianus

2019/05/31 09:01

さすがに、forEach(data=>{hoo(data);})はforEach(hoo)で良いのではないでしょうか?
yambejp

2019/05/31 09:05

ああ、なるほどそうですね
narutona

2019/05/31 10:08 編集

お世話になっております。 蛇足は質問のレベルに降りてきてくださった感じでしょうか? 教えて頂きたいのですが「...x」「...y」とはなんでしょうか?
yambejp

2019/05/31 10:14

var obj = ’・・・’ という文字列になっているのでだめです 仮にシングルクォートをとったとしても uxに指定しているa~eが変数として機能するのでおかしいです 文字列リテラルとして捉えられるようにダブルクォートで囲んでください それも含めて私の回答のvar objのような書き方でお願いします
narutona

2019/05/31 11:12

再度までありがとうございます!jsfiddleご覧になってくださったんですね。失礼かと思って消してしましました。なるほどシングルクオートのせいでオブジェクトではなくなっていたわけですか。ありがとうございました。
guest

0

narutona様の習熟度に合わせてfor文のみで回答してみます。

元のコードの問題点は2箇所あります。

  1. for in で書くと、連想配列(オブジェクト)のキーを取得するだけなので、array[key]で値を取り出さないといけない。
  2. arrayの中身が3重構造になっているので、for文がもうひとつ必要。

arrayの3重目は通常の配列なので、for of が使えます(連想配列(オブジェクト)では使えない)。for in とは違い、値を直接取り出せるのでこちらを使うとよいです。

修正したコードは下の通りになります。

js

1for (let id in array) { 2 for (let month in array[id]) { 3 for (let post of array[id][month]) { 4 const data = { 5 id: post.id, 6 ux: post.ux 7 }; 8 hoo(data); 9 } 10 } 11}

投稿2019/05/31 09:57

HAC

総合スコア118

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

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

narutona

2019/05/31 11:11

ざっと調べただけでは私のケースに完璧にあったご説明というのがなく、いつも半端な理解のままでした。頂戴したご説明のおかげでこれまで不明瞭だったいくつかの点がつながり目の前がすっきり晴れた気分です。どうもありがとうございます。感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問