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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Q&A

解決済

2回答

2251閲覧

jsonから値を指定し、その値を持つ部分だけを取得したい

narutona

総合スコア23

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/07/09 19:28

編集2019/07/09 20:18

###実現したいこと
jQueryで、対象のjsonから、
user_id = '777'を持っている"user"の部分」
を取得するにはどのようにすればよろしいでしょうか?

js

1// 対象 2var json = '{ 3 "comment":[ 4 { 5 "comment_id":2, 6 "comment_type":"A", 7 "user":{"user_id":"777","user_type":"guest"}, // ここだけ取得したい 8 "vote":0 9 }, 10 { 11 "comment_id":1, 12 "comment_type":"A" 13 } 14 ] 15}';

つまり、上記jsonから下記resultを取得したいのです。

// 取得 var user_id = '777'; var result = '知りたい処理'; // 出力 console.log( result ); // '{"user_id":"777","user_type":"guest"}' という風に取得したい

ちなみにjsonには同じuser_idが複数ありえますが、取得する"user"は最初の1つだけで構いません。

###試したこと
$.grepを使って下記を書いてみましたが、空の配列が取得されるだけでした…

jQuery

1// 対象 2var json = '{"comment":[{"comment_id":2,"comment_type":"A","user":{"user_id":"777","user_type":"guest"},"vote":0},{"comment_id":1,"comment_type":"A"}]}'; 3var object = JSON.parse( json ); 4 5// 取得 6var user_id = '777'; 7var result = $.grep(object, 8 function(obj, idx){ 9 return (obj.user_id == user_id); 10 } 11); 12 13// 出力 14console.log( result );

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

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

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

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

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

guest

回答2

0

ベストアンサー

javascript

1const a = object.comment.find(e=>e.user&&e.user.user_id&&e.user.user_id==="777") 2const result = a === undefined ? a : a.user

投稿2019/07/09 22:31

papinianus

総合スコア12705

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

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

narutona

2019/07/09 22:38

な…すごくないですか?まずfindは普通のfindで、でも中身がまるごと関数になっているということですよね? その中についてなのですが、「=>」と「&&」は何を意味しているのか、もしよろしければ教えていただけませんでしょうか? 「=>」はアロー関数かなとは思ったのですが、「&&」はif以外にも使えるのでしょうか?
papinianus

2019/07/09 22:42

=>はアロー関数です &&はよくifで使うそれです。if以外でも使えます。&&は左がtrueっぽかったら右を返し、左がFalseっぽかったら左を返します
papinianus

2019/07/09 22:44

array.prototype.findって関数しか取りませんよね?
narutona

2019/07/09 23:17

&&にそのような使い方があったとは、ご慧眼に脱帽です。ご説明ありがとうございました。 ところで、すみませんが下記はどのような意味でしょうか? >array.prototype.findって関数しか取りませんよね?
guest

0

こんにちは

ご質問にある JSON の要件を、以下のように解釈しての回答になります。

  • 与えられる JSON の形式は、 { "comment": <配列> } というもので、 <配列> の要素は、以下のようなオブジェクトである。

json

1{ 2 "comment_id":2, 3 "comment_type":"A", 4 "user":{ 5 "user_id":777, 6 "user_type":"guest" 7 }, 8 "vote":0 9}
  • ただし、上記のオブジェクトに "user""vote" が無い場合がある。

上記のような JSON をパースして得られる objectcomment から、 user_id が 777 である要素のうち、先頭に近いものを得るには、find を使って以下のように書けます。

javascript

1const matchedComment = object.comment.find(c => c.user && c.user.user_id === 777);

上記で、user_idが 777 のコメントが見つかった場合は、matchedComment にそのコメント要素が入ります。見つからなかった場合は undefined になります。

以下は、動作確認用に作ったこのJSONの中から上記のコードを使って、結果を表示するコード例です。

上記のJSONデータの中には user_id が 777 の要素が2つありますが、先頭に近い comment_id が 905 のほうが該当した要素として取得できていることを確認できると思います。

以上、参考になれば幸いです。

補足

上記の回答では、 JSONに出現するuser_id が数値と解釈してしまっておりましたが、 user_id"777" のような文字列なのでしたら、以下のように、 find に与える関数の条件に出てくる 777 も以下のように文字列 "777" にしてください。

javascript

1const matchedComment = object.comment.find(c => c.user && c.user.user_id === "777");

投稿2019/07/09 22:52

編集2019/07/09 22:59
jun68ykt

総合スコア9058

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

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

narutona

2019/07/09 23:15

jun68yktさま、いつも極めて良質なご回答に感謝致します。みなさん同じご意見のようで、安心感が増しました。どうもありがとうございます。出力の方法なども勉強になりました。
jun68ykt

2019/07/09 23:20

どういたしまして。解決されたようでよかったです ????
narutona

2019/07/09 23:34

はい????またお目に留まる機会がございましたらどうぞ宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問