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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

498閲覧

【Javascript】配列の中の配列の中の配列の中の... 階層が分からない配列のループの回し方

TatsuyaOkawa

総合スコア29

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

2クリップ

投稿2020/11/06 11:47

下のような配列があるとき、①・②を繰り返し全てのnameを出力したいです。
① その階層にある nameconsole.logで出力
group と言う key がある場合は下の階層へ

現状は2階層までと決まっているので直打ちで作成したんですがこれから増えるようなので
簡潔に階層がどう増えたり減ったりしても対応できるコードに修正したいです。

javascript

1const arr = [ 2 { 3 name: 'taro', 4 group: [ 5 { 6 name: 'kota', 7 group: [ 8 { 9 name: 'hiro' 10 } 11 ] 12 }, 13 ], 14 }, 15 { 16 name: 'tatsuya', 17 group: [ 18 { 19 name: 'shota' 20 } 21 ] 22 } 23]

自作コードがなく申し訳ありませんが、ご教示のほどよろしくお願い致します。

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

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

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

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

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

yambejp

2020/11/06 11:53

1段階目のnameとgroupの中のname以外は拾いたくないということでOKですか? すべてのnameを拾うほうが楽なんですが・・・
think49

2020/11/06 13:07

> 自作コードがなく申し訳ありませんが、ご教示のほどよろしくお願い致します。 自覚があるのでしたら、修正しましょう。 https://teratail.com/help/avoid-asking
AkitoshiManabe

2020/11/07 10:14

> 現状は2階層までと決まっているので直打ちで作成したんですがこれから増えるようなので 簡潔に階層がどう増えたり減ったりしても対応できるコードに修正したいです。 提示されたような配列オブジェクト(arr)の構築もしたいということでしょうか。 ならば、修正を希望する元のソースを示すべきです。
guest

回答2

0

再帰呼び出しで。

JavaScript

1function foo(a){ 2 a.forEach(x => { 3 console.log(x.name); 4 if("group" in x){ 5 foo(x.group); 6 } 7 }) 8} 9foo(arr)

投稿2020/11/06 12:20

otn

総合スコア85901

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

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

0

ベストアンサー

今回の命題ですと、nameの親の親を覚えておく必要があります
処理的にはこう

投稿2020/11/06 12:08

yambejp

総合スコア116734

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

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

yambejp

2020/11/06 12:19

const array_values=(v,key,parent1,parent2)=>{ var ret=[]; if(/Number|String|Null/.test(Object.prototype.toString.call(v))){ ret.push([v,key,parent1,parent2]); }else{ Object.entries(v).forEach((x,y)=>{ret=ret.concat(array_values(x[1],x[0],key,parent1))}); } return ret; } var names=array_values(arr).filter(x=>(x[1]=="name" && (x[3]==null || x[3]=="group"))).map(x=>x[0]); console.log(names);
yambejp

2020/11/06 12:20

ただこれもgroupキーの先祖がgroupであることは保証していませんので きっちりやるならルートから自分自身までのキーをすべて保持してチェックする必要があります
yambejp

2020/11/06 12:52

単にキーがnameの値をとるだけならこれでいけます const array_values=(v,key)=>{ var ret=[]; if(/Number|String|Null/.test(Object.prototype.toString.call(v))){ ret.push([v,key]); }else{ Object.entries(v).forEach(x=>{ret=ret.concat(array_values(x[1],x[0]))}); } return ret; } const names=array_values(arr).filter(x=>x[1]=="name").map(x=>x[0]); console.log(names);
TatsuyaOkawa

2020/11/20 06:15

返信が遅くなってしまって申し訳ありません。 こちらを参考に進めさせていただき解決いたしました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問