teratail header banner
teratail header banner
質問するログイン新規登録
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回答

1881閲覧

読み込んだJSONファイルでAND検索

m_a_u_v_e

総合スコア22

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

投稿2021/09/16 07:19

0

0

前提・実現したいこと

JSONファイルを読み込み、ラジオボタンにてカテゴリと年度の選択肢があり、
選択された両方の条件(AND検索)を満たすものだけjqueryにて表示させたいのですが、正しく表示ができません。

カテゴリと年度にて選択された条件をいずれも満たす場合での解決策を、ご教授頂きたくお願いいたします。

jsfiddleに現状のコードをアップいたしました。

https://jsfiddle.net/m_a_u_v_e/guLekpot/5/

該当のソースコード

JSON

1[ 2 { "category": "[cafe,2021]", "caption": "カフェ 2021" }, 3 { "category": "[autum,2021]", "caption": "秋 2021" }, 4 { "category": "[tokyo,2021]", "caption": "東京 2021" }, 5 { "category": "[autum,2020]", "caption": "秋 2020" }, 6 { "category": "[tokyo,2020]", "caption": "東京 2020" }, 7 { "category": "[cafe,2020]", "caption": "カフェ 2020" } 8] 9

jquery

1$(function(){ 2 3 var $imageWrap = $("#imageWrap"); 4 var alldata = []; //ここはすべてのデータを保持しておく配列 5 var filterdata = []; //フィルターを掛けたデータを保持する配列 6 7 $.ajax({ 8 // 読み込みの設定 9 type: "POST", 10 url: "data.json", // ファイルパス(相対パス) 11 dataType: "json", // ファイル形式 12 success: init, 13 }); 14 15 function init(data){ 16 alldata = data; 17 //最初に読み込んだときは全部標示する 18 filterdata=alldata; 19 //表示させる 20 display(); 21 } 22 23 //画像表示 24 function display(){ 25 $imageWrap.empty(); 26 for(var i=0; i < filterdata.length; i++){ 27 $('<li><p>'+filterdata[i].caption+'</p></li>').appendTo($imageWrap); 28 } 29 } 30 31 //ラジオボタンが変わった時にフィルタリングする 32 $('input:radio').change(function(){ 33 34 //チェックボタンの状況によってフィルタリングする 35 var cate=$(this).val(); 36 37 //フィルターの配列をいったん空っぽにする 38 filterdata=[]; 39 40 if(cate==="all"){//allが選択されたら全データを保持 41 filterdata=alldata; 42 43 }else{ 44 45 filterdata = $.grep(alldata,function(n, idx){ 46 return n.category.includes(cate); 47 } 48 ); 49 50 } 51 52 display(); 53 54 }); 55 56}); 57

HTML

1<form> 2 <p>カテゴリ</p> 3 <div class="form01"> 4 <span> 5 <input type="radio" name="list" value="all" checked> 6 <label>All</label> 7 </span> 8 <span> 9 <input type="radio" name="list" value="cafe"> 10 <label>cafe</label> 11 </span> 12 <span> 13 <input type="radio" name="list" value="tokyo"> 14 <label>tokyo</label> 15 </span> 16 <span> 17 <input type="radio" name="list" value="autum"> 18 <label>autum</label> 19 </span> 20 </div> 21</form> 22<form> 23 <div class="form2"> 24 <p>年度</p> 25 <span> 26 <input type="radio" name="list" value="2021"> 27 <label>2021</label> 28 </span> 29 <span> 30 <input type="radio" name="list" value="2020"> 31 <label>2020</label> 32 </span> 33 </div> 34</form>

何卒よろしくお願いいたします。

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

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

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

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

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

yambejp

2021/09/16 07:41

jsonデータが配列で管理するには不十分ですが、このフォーマットで確定でしょうか?
m_a_u_v_e

2021/09/16 07:48

ご確認ありがとうございます。 jsonデータについてですが、フォーマットは確定ではございません。 どのような管理の仕方でも問題はありません。
guest

回答2

0

ベストアンサー

まず JSON.stringifyする配列の要素を修正するで。

diff

1- { "category": "[cafe,2021]", "caption": "カフェ 2021" }, 2- { "category": "[autum,2021]", "caption": "秋 2021" }, 3- { "category": "[tokyo,2021]", "caption": "東京 2021" }, 4- { "category": "[autum,2020]", "caption": "秋 2020" }, 5- { "category": "[tokyo,2020]", "caption": "東京 2020" }, 6- { "category": "[cafe,2020]", "caption": "カフェ 2020" } 7+ { category: ["cafe", "2021"], caption: "カフェ 2021" }, 8+ { category: ["autum" ,"2021"], caption: "秋 2021" }, 9+ { category: ["tokyo", "2021"], caption: "東京 2021" }, 10+ { category: ["autum","2020"], caption: "秋 2020" }, 11+ { category: ["tokyo", "2020"], caption: "東京 2020" }, 12+ { category: ["cafe", "2020"], caption: "カフェ 2020" }

修正前の "[cafe,2021]"だと、categoryプロパティの値は、 [cafe,2021] という配列ではなく、
"[cafe,2021]"というひとつの文字列になってまう。これは想定してるのとちゃうやろ。

ほんで、ラジオボタンの選択値が変わったときの処理は、いろいろやり方あんのやろけど、たとえばこないな感じ:

javascript

1 //ラジオボタンが変わった時にフィルタリングする 2 $('input:radio').change(function() { 3 4 // 2つのformにおけるラジオボタンの選択値を取得 5 var [category, year] = $('input:radio:checked').map((_, elem) => $(elem).val()).get(); 6 7 // いったん filterdata を alldata にリセット 8 filterdata = alldata; 9 10 // カテゴリによるフィルタ 11 if (category !== 'all') { 12 filterdata = filterdata.filter(e => e.category[0] === category); 13 } 14 15 // 年度によるフィルタ 16 if (year) { 17 filterdata = filterdata.filter(e => e.category[1] === year); 18 } 19 20 // 該当アイテムの表示 21 display(); 22 23 });

これで、一応動くやろと思いますわ。

そやけど、もう一点、お節介言わしてもらうと、冒頭でJSONにする配列要素を

diff

1- { "category": "[cafe,2021]", "caption": "カフェ 2021" }, 2+ { category: ["cafe", "2021"], caption: "カフェ 2021" },

っていう修正しなはれと言うたけど、もひとつ言うと、これの categoryゆうプロパティの名前はどうもしっくりきまへんな。なぜかゆうたら、まず値が配列なのやから複数形にしたってくらはい。ほならcategories にすればええかいうたら、それでもよろしくない気いするわ。というのは画面ではこう

イメージ説明

なっとって、「カテゴリ」というくくりで言われるものは、配列["cafe", "2021"] の先頭要素だけで、"2021" は「年度」というくくりで呼ばれるものだからです。そやから、たとえばの話、

javascript

1{ tags: ["cafe", "2021"], caption: "カフェ 2021" }

にして、「tags はタグの配列で、その第一要素はカテゴリ、第二要素は年度を表すタグである。 」という仕様上の取り決めをするか、もしくは、いっそ配列をやめて

javascript

1{ category: "cafe", year: 2021, caption: "カフェ 2021" }

にするとかしたほうがええんちゃう?思いました。
ほなまた〜

投稿2021/09/16 09:01

編集2021/09/16 09:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m_a_u_v_e

2021/09/17 03:36

意図した動作になりました。 コードの細かいところ調べて理解したいと思います。 混乱を招かない命名についても必要と感じました。 色々とご教示いただきありがとうございます!
guest

0

sample.json

json

1[ 2 { "category": ["cafe", "2021"], "caption": "カフェ 2021" }, 3 { "category": ["autum","2021"], "caption": "秋 2021" }, 4 { "category": ["tokyo","2021"], "caption": "東京 2021" }, 5 { "category": ["autum","2020"], "caption": "秋 2020" }, 6 { "category": ["tokyo","2020"], "caption": "東京 2020" }, 7 { "category": ["cafe", "2020"], "caption": "カフェ 2020" } 8]

javascript

1<script> 2window.addEventListener('DOMContentLoaded', async()=>{ 3 var data=await fetch("sample.json").then(res=>res.json()); 4 document.addEventListener('change',e=>{ 5 if(e.target.closest('[type=radio]')){ 6 var v1=document.querySelector('[name=list]:checked').value; 7 var v2=document.querySelector('[name=nendo]:checked').value; 8 view.textContent=data.filter(x=>(x.category.includes(v1)||v1=="all") && (x.category.includes(v2)||v2=="all")).map(x=>x.caption).join(",") 9 } 10 }); 11}); 12 13</script> 14<form> 15 <p>カテゴリ</p> 16 <div class="form01"> 17 <span> 18 <label><input type="radio" name="list" value="all" checked> 19 All</label> 20 </span> 21 <span> 22 <label><input type="radio" name="list" value="cafe"> 23 cafe</label> 24 </span> 25 <span> 26 <label><input type="radio" name="list" value="tokyo"> 27 tokyo</label> 28 </span> 29 <span> 30 <label><input type="radio" name="list" value="autum"> 31 autum</label> 32 </span> 33 </div> 34 <div class="form2"> 35 <p>年度</p> 36 <span> 37 <label><input type="radio" name="nendo" value="all" checked> 38 All</label> 39 </span> 40 <span> 41 <label><input type="radio" name="nendo" value="2021"> 42 2021</label> 43 </span> 44 <span> 45 <label><input type="radio" name="nendo" value="2020"> 46 2020</label> 47 </span> 48 </div> 49</form> 50<div id="view"></div>

投稿2021/09/16 07:59

yambejp

総合スコア117944

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

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

m_a_u_v_e

2021/09/17 03:34 編集

ご教示誠にありがとうございます。JSONの方も不完全でした、失礼いたしました。 いただいたコードの方まだ理解などはできておりませんが、早速試してみました。 consoleにview is not defined at HTMLDocument.というエラーがでておりまして、 正常に検索機能ができていないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問