前提・実現したいこと
■概要■
「スマホ」と入力したときに、「スマホ」「スマートフォン」「スマートホン」を表示したい。
さらに、「スマホ」という半角入力でも同様の表示をしたい。
■詳細■
JSONを辞書にして、入力ワードに合うものを検索結果として表示したいです。
具体的には、「入力値」と「JSONの"relation"」を比較して、一致したらその「JSONの"name"」を検索結果として表示する機能です。
そのときに半角や全角の変換もしたいのですが、その変換機能で次の問題に躓いてしまいました。
発生している問題・エラーメッセージ
・配列(searchArr)に、重複した値が作られてしまうこと。
・検索結果が表示できないこと。
が問題です。
どのようにすれば解決し、冒頭の実現したいことができるようになるでしょうか?
エラーなし
該当のソースコード
この「inputの入力値」と、「JSONの"relation"」を比較し、「ul」に「JSONの"name"」を表示したいという流れです。
jQuery
1<div class="searchBox"> 2 <input type="text"> 3</div> 4<ul>ここに「JSONの"name"」を表示したい</ul>
試したソースコード
「JSONの"relation"」には正式名称と略語などが入っているので、
それと入力値を比較して、
一致したらその「JSONの"name"」を検索結果として表示する。
という機能のつもりで書いたのが下記のソースコードになります。
問題は入力値の変換機能です。
動作サンプル:https://jsfiddle.net/wq68f0ye/
jQuery
1/* 2* 検索される辞書 3***********************/ 4// 見やすく改行してますが、実際は改行なしです 5var jsn = '[ 6{"id":1,"name":"スマホ","relation":"スマホ,スマートフォン,スマートホン"}, 7{"id":2,"name":"スマートフォン","relation":"スマホ,スマートフォン,スマートホン"}, 8{"id":3,"name":"スマートホン","relation":"スマホ,スマートフォン,スマートホン"}, 9{"id":4,"name":"USB","relation":"USB,Universal Serial Bus"}, 10{"id":5,"name":"Universal Serial Bus","relation":"USB,Universal Serial Bus"} 11]'; 12 13var obj = JSON.parse(jsn); 14 15 16/* 17* 検索を実行 18***********************/ 19$(document).on( 'input', '.searchBox input', function() { 20 21 // 入力値を配列に 22 const inp = $(this).val(); 23 const searchArr = inp.split(/[\u3000&\x20;]/g); 24 25 // 入力値の配列を変換 26 $.each(searchArr, function(i, v) { 27 // 後述の関数で変換する 28 hull2half(v) ? searchArr.push(hull2half(v)) : searchArr; 29 half2full(v) ? searchArr.push(half2full(v)) : searchArr; 30 hira2kata(v) ? searchArr.push(hira2kata(v)) : searchArr; 31 kata2hira(v) ? searchArr.push(kata2hira(v)) : searchArr; 32 halfkata2fullkata(v) ? searchArr.push(halfkata2fullkata(v)) : searchArr; 33 }); 34 35 // チェック 36 console.log(searchArr); 37 38 // リストを表示 39 let dispArr = []; 40 if( inp.length ){ 41 // 検索結果を表示 42 Object.values(obj).forEach(data=>{ 43 if( data['relation'].indexOf(searchArr) != -1 ){ 44 dispArr.push( '<li>' +data['name']+ '</li>' ); 45 } 46 }); 47 } 48 else{ 49 // 全て表示 50 Object.values(obj).forEach(data=>{ 51 dispArr.push( '<li>' +data['name']+ '</li>' ); 52 }); 53 } 54 $( 'ul' ).html( dispArr ); 55});
そして以下が問題の、入力値の変換機能になります。これが上の「$.each」できちんと動作せず、問題が発生しているのだと思います。
/* * 検索文字の変換関数たち ***********************/ // 全角英数を半角英数に変換 function hull2half(str) { if( str.match(/[A-Za-z0-9]/g) ){ return str.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0)-0xFEE0); }); } } // 半角英数を全角英数に変換 function half2full(str) { if( str.match(/[A-Za-z0-9]/g) ){ return str.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) + 0xFEE0); }); } } // ひらがなをカタカナに変換 function hira2kata(str) { if( str.match(/[ぁ-ん]/g) ){ return str.replace(/[ぁ-ん]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) + 0x60); }); } } // カタカナをひらがなに変換 function kata2hira(str) { if( str.match(/[ァ-ン]/g) ){ return str.replace(/[ァ-ン]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) - 0x60); }); } } // 半角カタカナを全角カタカナに変換 // 変換前 var beforeStr = new Array('ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ー','ヴ','ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ','ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ','ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ヲ','ン'); // 変換後 var afterStr = new Array('ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ー','ヴ','ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ','ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ','ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ヲ','ン'); function halfkata2fullkata(str) { var fullStr = str; for(var i = 0; i < beforeStr.length; i++) { fullStr = fullStr.replace(new RegExp(beforeStr[i], 'g'), afterStr[i]); } return fullStr; }
長くなってしまい申し訳ございませんが、どなたか解決できましたら宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/10 07:17