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

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

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

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

Q&A

解決済

2回答

326閲覧

オブジェクト内で条件に一致する値を取得する方法

ruuuu

総合スコア168

JavaScript

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

0グッド

0クリップ

投稿2022/09/12 09:22

編集2022/09/12 09:29

下記のデータ内で、planList.plans.idが、指定した値(5)に一致する「score」の値のみ取得したいと考えているのですが、自分の実装方法だとうまく取得出来ません。

const planList = [ { id: '1', name: 'aaaa', plans: [ { id: '1', name: 'test1', score: '150', }, { id: '2', name: 'test2', score: '220', }, { id: '3', name: 'test3', score: '300', } ] }, { id: '2', name: 'bbbb', plans: [] }, { id: '3', name: 'ccccc', plans: [ { id: '4', name: 'test5', score: '100', }, { id: '5', name: 'test6', score: '200', }, { id: '6', name: 'test7', score: '900', } ] }, ]

自分が実装したコードは下記になります

planList.forEach(e1 => { const result = e1.plans.find(e2 => { if (e2.id === '5') { return e2.score } else { return false } }) if(result) { const planPoint = result } }) console.log('point' , planPoint)

こちら、どなたか解決方法につきまして、ご助言頂けましたら幸いです

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

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

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

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

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

guest

回答2

0

ポイントはid=5となるオブジェクトがユニークとは限らないことです。
こんな感じにするとよいかも

javascript

1const getAllValuesWithKeys=(obj,keys)=>{ 2 let ret=[]; 3 Object.entries(obj).forEach(ent=>{ 4 ret=ret.concat( 5 ent[1] instanceof Object? 6 getAllValuesWithKeys(ent[1],[ent[0]].concat(keys?keys:[])): 7 [ent.concat(keys?[keys]:[[]])] 8 ); 9 }); 10 return ret; 11}; 12const tmp=getAllValuesWithKeys(planList); 13const res=tmp.filter(x=>x[0]=="score"&&tmp.filter(x=>x[0]=="id" && x[1]=="5").map(x=>JSON.stringify(x[2])).includes(JSON.stringify(x[2]))).map(x=>x[1]); 14console.log(res);

投稿2022/09/12 10:25

yambejp

総合スコア114742

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

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

ruuuu

2022/09/12 11:20

ご回答ありがとうございます。 > ポイントはid=5となるオブジェクトがユニークとは限らないことです。 確かにこちらの前提があった場合は、こちらを考慮し実装する必要があったかもしれません。 今回はidが5であるオブジェクトが複数あってもそれはユニークであるとの前提のつもりで質問しました。 より正確な情報を質問文に追記していくよう注意していきたいと思います。
yambejp

2022/09/12 11:24

そういうことでしたらid=1,2,3が複数発生するサンプルはよろしくなかったですね
guest

0

ベストアンサー

ブロック内でconst宣言した変数はブロックから抜けると破棄されますよ。
最初に変数宣言するといいです。

js

1 let planPoint; 2 planList.forEach(e1 => { 3 const result = e1.plans.find(e2 => e2.id === '5'); 4 if(result){ 5 planPoint = result.score; 6 } 7 }) 8 console.log('point' , planPoint)

他の方法:

js

1const planPoint = planList.map(plan => plan.plans).flat().find(plan => plan.id === '5')?.score; 2console.log('point' , planPoint)

投稿2022/09/12 09:39

編集2022/09/12 09:58
shiracamus

総合スコア5406

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

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

ruuuu

2022/09/12 10:17 編集

ご回答ありがとうございます。 > ブロック内でconst宣言した変数はブロックから抜けると破棄されますよ。 最初に変数宣言するといいです。 こちら、何故か、変数宣言したはずが何らか他コードの影響でエラー出ていたみたいでして、混乱してしまっていたのですが、再度検証してみましたら、エラーは表示されず実行できました。 しかし、ご提示頂いたコードの方が明らかにシンプルだし読みやすいですね。 ご提示頂いたコードで思い出したのですが、「flatMap」を最近どこかで聞いてこちらを取り入れてみたのですが、こちらの形でも値の取得が出来ました const score = planList .flatMap(plan => plan.plans) .find(plan => plan.id === '5').score エラーの問題もありましたし、冗長になってしまっていたので教えて頂き大変助かりました。
shiracamus

2022/09/12 10:46

find で見つからないと .score がエラーになりますので、 ?.score と ? を付けておくといいですよ。
ruuuu

2022/09/12 11:03 編集

ありがとうございます。 検証してみました所、ご指摘の通りエラーとなってしまいました。 「?」こちらを付与しておきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問