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

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

ただいまの
回答率

90.35%

  • JavaScript

    22087questions

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

  • jQuery

    8755questions

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

  • JSON

    1555questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 170

narutona

score 17

実現したいこと

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

// 対象
var json = '{
  "comment":[
    {
      "comment_id":2,
      "comment_type":"A",
      "user":{"user_id":"777","user_type":"guest"}, // ここだけ取得したい
      "vote":0
    },
    {
      "comment_id":1,
      "comment_type":"A"
    }
  ]
}';


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

// 取得
var user_id = '777';
var result = '知りたい処理';

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

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

試したこと

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

// 対象
var json = '{"comment":[{"comment_id":2,"comment_type":"A","user":{"user_id":"777","user_type":"guest"},"vote":0},{"comment_id":1,"comment_type":"A"}]}';
var object = JSON.parse( json );

// 取得
var user_id = '777';
var result = $.grep(object,
  function(obj, idx){
    return (obj.user_id == user_id);
  }
);

// 出力
console.log( result );
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/10 07:38

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

    キャンセル

  • 2019/07/10 07:42

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

    キャンセル

  • 2019/07/10 07:44

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

    キャンセル

  • 2019/07/10 08:17

    &&にそのような使い方があったとは、ご慧眼に脱帽です。ご説明ありがとうございました。

    ところで、すみませんが下記はどのような意味でしょうか?

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

    キャンセル

+1

こんにちは

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

  • 与えられる JSON の形式は、 { "comment": <配列> } というもので、 <配列> の要素は、以下のようなオブジェクトである。
{
  "comment_id":2,
  "comment_type":"A",
  "user":{
    "user_id":777,
    "user_type":"guest"
  },
  "vote":0
}

 

  • ただし、上記のオブジェクトに "user" と "vote" が無い場合がある。

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

const 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" にしてください。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/10 08:15

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

    キャンセル

  • 2019/07/10 08:20

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

    キャンセル

  • 2019/07/10 08:34

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

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    22087questions

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

  • jQuery

    8755questions

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

  • JSON

    1555questions

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