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

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

新規登録して質問してみよう
ただいま回答率
85.47%
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回答

658閲覧

JSONから特定のワードで該当する最初のグループのみ表示させ、falseの結果を非表示にしたい

southern_flavor

総合スコア70

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クリップ

投稿2020/05/22 17:17

編集2020/05/24 10:08

やりたいこと

JSONでの取得してからの出力結果をこちらの意図したように表示したいです。

次のような形です。

  1. 下記JSON内のdetailが該当するキーワードが複数存在する場合、最初の1グループだけを表示

下記JSONを例にすると「東北」ですと、このような結果になります。

宮城(2件) 秋田(1件)

宮城が最初にきていますので、これで宮城のグループだけ表示したいです。

牛タン
デリバリー可
ghutan.com

気仙沼ホルモン
EC販売
kesennuma.com

一番最後に希望の出力形式を記載します。 2. 下記JSON内のdetaiが1件のみ場合はdetail内のprefで表示されるものを要素ごと非表示したが、結果でfalseと表示されてしまう (下記JSONで例えると「region: 関西」です) です。 1.は調べてもやり方がまったくわからない状態なので、教えていただけたら幸いです。 2.「false」と表示されてしまいます。これを消すにはどうしたらいいでしょうか? 現在作業中のコード・取得したJSONとそこから得られる結果を記載します。 コードについては先日、こちらへ別件で質問した際にいろいろ教えていただいたものを少し変えています。 [リンク内容](https://teratail.com/questions/260771) ```javascript const jsonPath = path; $.ajax({ type: 'GET', url: jsonPath, cache: false, success: shopLoop, }); function prefsInfo(detail) { const counts = _.mapValues(_.groupBy(detail, "pref"), 'length'); const sortedCounts = Object.entries(counts).sort((e1, e2) => e2[1]-e1[1]); return sortedCounts.map(([pref, count]) => (sortedCounts.length !== 1) && `<li data-name="${pref}">${pref}(${count}件)</li>`).join(' '); } function shopLoop(jsondata) { const regionsHtml = jsondata.map( ({ region, detail },i) => { const prefs = prefsInfo(detail); const items = detail.map( e => `<div> <ul> <li>${e.product}</li> <li>${e.type}</li> </ul> <div> <a href="${e.url}"><img src="./store_shop_ico.png" alt="" srcset="">${e.url}</a> </div> </div> ` ).join(''); var h = `<h2>${region}</h2>` + `<div>` + `<ul class="hoge-${i++}">${prefs}</ul>` + `${items}` + `</div>`; return h; }); $('#hoge-list').html(regionsHtml); }

JSON

1[ 2 { 3 "region": "東北", 4 "detail": [ 5 { 6 "pref": "宮城", 7 "product": "牛タン", 8 "url": "ghutan.com", 9 "type": "デリバリー可" 10 }, 11 { 12 "pref": "宮城", 13 "product": "気仙沼ホルモン", 14 "url": "kesennuma.com", 15 "type": "EC販売" 16 }, 17 { 18 "pref": "秋田", 19 "product": "きりたんぽ", 20 "url": "kiritanpo.com", 21 "type": "EC、デリバリー可" 22 } 23 ] 24 }, 25 { 26 "region": "関東", 27 "detail": [ 28 { 29 "pref": "東京", 30 "product": "東京ばなな1", 31 "url": "tokyobanana1.com", 32 "type": "EC販売" 33 }, 34 { 35 "pref": "東京", 36 "product": "東京ばなな2", 37 "url": "tokyobanana2.com", 38 "type": "デリバリー販売" 39 }, 40 { 41 "pref": "埼玉", 42 "product": "草加せんべい", 43 "url": "sokasenbei.com", 44 "type": "デリバリー可" 45 }, 46 { 47 "pref": "埼玉", 48 "product": "さつまいも料理", 49 "url": "satsumaimo.com", 50 "type": "テイクアウト可" 51 } 52 ] 53 }, 54 { 55 "region": "関西", 56 "detail": [ 57 { 58 "pref": "大阪", 59 "product": "たこやき", 60 "url": "takoyaki.com", 61 "type": "テイクアウト可、EC販売" 62 } 63 ] 64 } 65]

このようになります。

HTML

html

1<h2>東北</h2> 2<div> 3 <ul class="hoge-0"> 4 <li>宮城(2件)</li> 5 <li>秋田(1件)</li> 6 </ul> 7 <div> 8 <ul> 9 <li>牛タン</li> 10 <li>デリバリー可</li> 11 </ul> 12 <div> 13 <a href="ghutan.com"><img src="./store_shop_ico.png" alt="" srcset="">ghutan.com</a> 14 </div> 15 </div> 16 <div> 17 <ul> 18 <li>気仙沼ホルモン</li> 19 <li>EC販売</li> 20 </ul> 21 <div> 22 <a href="ghutan.com"><img src="./store_shop_ico.png" alt="" srcset="">ghutan.com</a> 23 </div> 24 </div> 25 <div> 26 <ul> 27 <li>きりたんぽ</li> 28 <li>EC、デリバリー可</li> 29 </ul> 30 <div> 31 <a href="kiritanpo.com"><img src="./store_shop_ico.png" alt="" srcset="">kiritanpo.com</a> 32 </div> 33 </div> 34</div> 35 36 37<h2>関東</h2> 38<div> 39 <div> 40 <ul class="hoge-1"> 41 <li>東京(2件)</li> 42 <li>埼玉(2件)</li> 43 </ul> 44 <div> 45 <ul> 46 <li>東京ばなな1</li> 47 <li>EC販売</li> 48 </ul> 49 <div> 50 <a href="tokyobanana1.com"><img src="./store_shop_ico.png" alt="" srcset="">tokyobanana1.com</a> 51 </div> 52 </div> 53 <div> 54 <ul> 55 <li>東京ばなな2</li> 56 <li>デリバリー販売</li> 57 </ul> 58 <div> 59 <a href="tokyobanana2.com"><img src="./store_shop_ico.png" alt="" srcset="">tokyobanana2.com</a> 60 </div> 61 </div> 62 63 <div> 64 <ul> 65 <li>草加せんべい</li> 66 <li>デリバリー可</li> 67 </ul> 68 <div> 69 <a href="sokasenbei.com"><img src="./store_shop_ico.png" alt="" srcset="">sokasenbei.com</a> 70 </div> 71 </div> 72 <div> 73 <ul> 74 <li>さつまいも料理</li> 75 <li>テイクアウト可</li> 76 </ul> 77 <div> 78 <a href="satsumaimo.com"><img src="./store_shop_ico.png" alt="" srcset="">satsumaimo.com</a> 79 </div> 80 </div> 81</div> 82 83<h2>関西</h2> 84<div> 85 <div> 86 <ul class="hoge-2"> 87 <li>false</li> 88 </ul> 89 <div> 90 <ul> 91 <li>たこやき</li> 92 <li>テイクアウト可、EC販売</li> 93 </ul> 94 <div> 95 <a href="takoyaki.com"><img src="./store_shop_ico.png" alt="" srcset="">takoyaki.com</a> 96 </div> 97 </div> 98</div>

ブラウザ表示

東北 宮城(2件) 秋田(1件) 牛タン デリバリー可 ghutan.com 気仙沼ホルモン EC販売 kesennuma.com きりたんぽ EC、デリバリー可 kiritanpo.com 関東 東京(2件) 埼玉(2件) 東京ばなな1 EC販売 tokyobanana1.com 東京ばなな2 デリバリー販売 tokyobanan2.com 草加せんべい デリバリー可 sokasenbei.com さつまいも料理 テイクアウト可 satsumaimo.com 関西 false たこやき テイクアウト可、EC販売 takoyaki.com

#希望の出力形式
このような形にしたいです。

HTML表示

html

1<h2>東北</h2> 2<div> 3 <ul class="hoge-0"> 4 <li>宮城(2件)</li> 5 <li>秋田(1件)</li> 6 </ul> 7 <div> 8 <ul> 9 <li>牛タン</li> 10 <li>デリバリー可</li> 11 </ul> 12 <div> 13 <a href="ghutan.com"><img src="./store_shop_ico.png" alt="" srcset="">ghutan.com</a> 14 </div> 15 </div> 16 <div> 17 <ul> 18 <li>気仙沼ホルモン</li> 19 <li>EC販売</li> 20 </ul> 21 <div> 22 <a href="ghutan.com"><img src="./store_shop_ico.png" alt="" srcset="">ghutan.com</a> 23 </div> 24 </div> 25</div> 26 27 28<h2>関東</h2> 29<div> 30 <div> 31 <ul class="hoge-1"> 32 <li>東京(2件)</li> 33 <li>埼玉(2件)</li> 34 </ul> 35 <div> 36 <ul> 37 <li>東京ばなな1</li> 38 <li>EC販売</li> 39 </ul> 40 <div> 41 <a href="tokyobanana1.com"><img src="./store_shop_ico.png" alt="" srcset="">tokyobanana1.com</a> 42 </div> 43 </div> 44 <div> 45 <ul> 46 <li>東京ばなな2</li> 47 <li>デリバリー販売</li> 48 </ul> 49 <div> 50 <a href="tokyobanana2.com"><img src="./store_shop_ico.png" alt="" srcset="">tokyobanana2.com</a> 51 </div> 52 </div> 53</div> 54 55<h2>関西</h2> 56<div> 57 <div> 58 <ul class="hoge-2"></ul> 59 <div> 60 <ul> 61 <li>たこやき</li> 62 <li>テイクアウト可、EC販売</li> 63 </ul> 64 <div> 65 <a href="takoyaki.com"><img src="./store_shop_ico.png" alt="" srcset="">takoyaki.com</a> 66 </div> 67 </div> 68</div>

ブラウザ表示

東北 宮城(2件) 秋田(1件) 牛タン デリバリー可 ghutan.com 気仙沼ホルモン EC販売 kesennuma.com 関東 東京(2件) 埼玉(2件) 東京ばなな1 EC販売 tokyobanana1.com 東京ばなな2 EC販売 tokyobanana2.com 関西 たこやき テイクアウト可、EC販売 takoyaki.com

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

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

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

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

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

southern_flavor

2020/05/23 04:52

ご指摘ありがとうございます。 カンマがないとご指摘がありましたのでこれを直すと結果が返ってくると思います。
m.ts10806

2020/05/23 04:53

質問修正して正しく提示してください。 間違ったままの質問のコードで、回答者が勝手に手で修正するのでは、質問者と同じ状況を再現確認できません。
southern_flavor

2020/05/23 05:00

すみません。JSON部分は先ほど訂正したのですが、質問内容に一部誤りがあったので再度、訂正します。
AkitoshiManabe

2020/05/23 09:37

希望の出力は プレーンテキスト なのでしょうか(textarea用など、普通に使うMIME形式です)。 もしHTMLであるなら、開発者コンソール([F12]キー)の Elements タブでコピペして、文書構造を示すように編集してください。
southern_flavor

2020/05/24 10:10

質問内容に漏れが多くて、申し訳ありません。。 HTML表示にするとごちゃごちゃしててわかりづらいかなと勝手に思っていました。 文章構造として示したほうがいいのは確かなので、二つのせました。 よろしくお願いします。
guest

回答2

0

JSONデータが間違っています、
ところどころカンマが抜けていてJSONデータとしてパーサーエラーをおこします

追記

こんな感じで整理するとよいかもしれません

javascript

1 var result=json.map(x=>[ 2 x.region, 3 x.detail.reduce((x,y)=>{ 4 if((n=x[0].indexOf(y.pref))==-1){ 5 x[0].push(y.pref); 6 x[1].push(1); 7 if(x[2].length==0) x[2][0]=[y.product,y.url,y.type]; 8 }else{ 9 x[1][n]++; 10 if(n==0) x[2].push([y.product,y.url,y.type]); 11 } 12 return x; 13 },[[],[],[]]), 14 ]); 15 console.log(result);

投稿2020/05/22 17:31

編集2020/05/23 07:05
yambejp

総合スコア114964

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

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

southern_flavor

2020/05/23 04:51

ご指摘ありがとうございます。 カンマの部分について、これから修正します。
southern_flavor

2020/05/24 17:38 編集

伝わりづらい質問内容にも関わらず、ソースコードを具体的に教えていただき、ありがとうございます。 こちらのコード、よく参考にさせていただきます。
guest

0

ベストアンサー

まだ、コードを詳細に読めていませんが、2つのHTMLを見比べると、

<li>false</li> を出力する部分に原因と期待する結果があると思います。

pref(count件) を埋め込む li に着目し、
他県データが無い&同県に登録データが1件しかない。
というのを条件に切り分けをしてみてはどうでしょう。

投稿2020/05/24 10:33

AkitoshiManabe

総合スコア5434

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

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

southern_flavor

2020/05/24 14:31

ご回答いただき、ありがとうございます。 そうですよね。おっしゃる通り、そのような条件式を書けばよいとは頭の中で考えていました。 が、その条件式の書き方がピンとこなくて現在はその辺りを調べています。 質問で書いたjsonの内容を前提に現状を書きたいと思います。 たとえば、一旦、東京だけで絞りたいとき、このようにかきました。 detail.map( e => ( e. pref === '東京' ) && `[detail内をhtml表示]`).join(''); このように書くと東京だけ絞られて東京のdetailが表示されます。 しかし、jsonの関東detail内には、埼玉もあります。 その埼玉の表示が 「false」という文字列としてブラウザで表示されます。 このfalse消すためには、falseになった場合の処理を書くことだと思いますが、 detail.map( e => ( e. pref === '東京' ) && `[detail内をhtml表示]`).join(''); これだとどこにfalseの場合の処理を書けば良いか、厚かましいようですがアドバイスもしくは参考サイトなどを教えていただけたら幸いです。
AkitoshiManabe

2020/05/24 16:12

教わっった関数は自分の使いやすいようにアレンジすればいいです。 例えば、アロー関数 の 右辺にあたる処理部は { 処理内容 return 返り値 } の形に書き換え、処理内容にconsole.log() を埋め込むなど、求める結果になるようにします。
southern_flavor

2020/05/24 17:36

アドバイスありがとございます。 いただいたアドバイスを参考にやってみたら、想定した通りの結果がでました。 質問のコードに対して関数で返り値、条件式に配列から取得した文字列比較を指定するだけで可能でした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問