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

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

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

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

Q&A

解決済

2回答

1651閲覧

[javascript]jsonデータから重複排除等整形するコードについてご教示ください

iarik

総合スコア101

JavaScript

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

0グッド

0クリップ

投稿2020/11/18 14:41

編集2020/11/18 14:44

したい事

以下のようなjsonデータがあります。

json

1{ 2 "data": [ 3 { 4 "shop": "A", 5 "members": [ 6 "user:a@xxx.com", 7 "user:c@xxx.com" 8 ] 9 }, 10 { 11 "shop": "B", 12 "members": [ 13 "user:a@xxx.com", 14 "user:b@xxx.com" 15 ] 16 } 17 ] 18}

上記jsonデータを元に以下の2種類のデータを生成したいです。

  • membersから重複を排除したユーザーのみ格納されている配列(array)

javascript

1newMembers["user:a@xxx.com","user:b@xxx.com","user:c@xxx.com"]
  • jsonを元にユーザーが所属しているshopの情報に再変換したデータ

javascript

1newData = { 2 "user:a@xxx.com":[A,B], 3 "user:b@xxx.com":[B], 4 "user:c@xxx.com":[A] 5}

質問

質問1

jsonデータのmembersから重複排除を行うコードを作成しましたが、jsonデータを格納しているrという変数以外にmembersnewMembersという変数を生成しており、もしrのデータが大きくなっていくと現在のコードではメモリー使用量的にあまりスマートではないように思えました。もし、他に良いアイディアがあればご教示頂きたいです。

var r = { "data": [ { "shop": "A", "members": [ "user:a@xxx.com", "user:c@xxx.com" ] }, { "shop": "B", "members": [ "user:a@xxx.com", "user:b@xxx.com" ] } ] }; var members = []; for (var i =0; i < r.data.length; i++) { members = members.concat(r.data[i]["members"]) } newMembers = [...new Set(members)] console.log(newMembers)

質問2

jsonからnewDataに変換するスマートなコードが思い浮かばず、悩んでおります。
なにか良いアイディアがあればご教示頂けますでしょうか。

json

1{ 2 "data": [ 3 { 4 "shop": "A", 5 "members": [ 6 "user:a@xxx.com", 7 "user:c@xxx.com" 8 ] 9 }, 10 { 11 "shop": "B", 12 "members": [ 13 "user:a@xxx.com", 14 "user:b@xxx.com" 15 ] 16 } 17 ] 18}

javascript

1newData = { 2 "user:a@xxx.com":[A,B], 3 "user:b@xxx.com":[B], 4 "user:c@xxx.com":[A] 5}

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

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

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

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

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

guest

回答2

0

質問1のメモリ使用量はそんなに気にする必要は無いと思います。

質問2は以下のような案はどうでしょうか?

javascript

1var r = { 2 "data": [ 3 { 4 "shop": "A", 5 "members": [ 6 "user:a@xxx.com", 7 "user:c@xxx.com" 8 ] 9 }, 10 { 11 "shop": "B", 12 "members": [ 13 "user:a@xxx.com", 14 "user:b@xxx.com" 15 ] 16 } 17 ] 18}; 19 20 21var newMembers = ["user:a@xxx.com","user:b@xxx.com","user:c@xxx.com"]; // 質問1の結果 22 23var getUserShops = (shopList, user) => shopList.filter(s=>s.members.includes(user)).map(s=>s.shop); 24var newData = Object.fromEntries( newMembers.map(user => [user, getUserShops(r.data, user)]) ); 25 26console.log(newData);

投稿2020/11/19 01:20

ku__ra__ge

総合スコア4524

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

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

iarik

2020/11/19 02:41

ご回答頂きありがとうございます。 newDataを求めるロジックについて分かりやすくコードを記載頂きありがとうございます。 一度、getUserShops関数を作成してmap()と組み合わせて求める方法についてとても勉強になりました。 ベストアンサーのチェックが付けられず申し訳ございません。
guest

0

ベストアンサー

javascript

1const members =[...new Set(r.data.map(x=>x.members).flat())]; 2const newData=Object.fromEntries(members.map(x=>[x,r.data.filter(y=>y.members.includes(x)).map(x=>x.shop)]));

投稿2020/11/19 01:13

yambejp

総合スコア114979

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

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

iarik

2020/11/19 02:37

ご回答頂きありがとうございます。 両者共に1行で目的のデータまでたどり着けているロジックに新ためて勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問