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

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

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

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

434閲覧

半角や全角を自動で変換できる検索機能を作りたいです

DiningKitchen

総合スコア14

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/06/09 20:27

編集2019/09/23 11:43

前提・実現したいこと

■概要■
「スマホ」と入力したときに、「スマホ」「スマートフォン」「スマートホン」を表示したい。
さらに、「スマホ」という半角入力でも同様の表示をしたい。

■詳細■
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; }

長くなってしまい申し訳ございませんが、どなたか解決できましたら宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、提示コードの通りとすれば data['relation'] は文字列なのであらかじめ配列にしておいたほうがいいでしょう。
data'relation' と searchArr(配列) との積があるかどうかを調べたいのだと思いますが、そのようなメソッドはないので用意するかループを回すかです。
https://qiita.com/IgnorantCoder/items/f371b6542f1353376b06
https://qiita.com/toshihikoyanase/items/7b07ca6a94eb72164257

投稿2019/06/10 01:10

x_x

総合スコア13749

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

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

DiningKitchen

2019/06/10 07:17

たしかに配列と配列の比較ですね。リンク先ありがとうございます。参考にさせて頂きます。
guest

0

データの構造から見なおしたほうがいいと思います。
今だと、1つキーワードが増える度に複数箇所を直さないといけないですよね?
しかもキーワードが増える度に治す箇所が指数関数的に増えていくのでメンテできなくなります。

以下の構造が最善とは思ってませんが、少なくとも以下サンプルのようにしていくべきと思います。

  • relationに元になるキーワードもわざと混ぜてます。
  • words.relationを調べれば確認出来るようにする為。

js

1let dic = [{ 2 "name": "UniversalSerialBus", 3 "relation": [{ 4 "name": "UniversalSerialBus" 5 }, { 6 "name": "USB" 7 }] 8}, { 9 "name": "スマートフォン", 10 "relation": [{ 11 "name": "スマートフォン", 12 },{ 13 "name": "スマホ" 14 }, { 15 "name": "スマートホン" 16 }] 17 }]; 18 19for (const words of dic) { 20 console.log(words.relation); 21} 22//[ { name: 'UniversalSerialBus' }, { name: 'USB' } ] 23//[ { name: 'スマートフォン' }, { name: 'スマホ' }, { name: 'スマートホン' } ] 24

もっといい構造が集まるといいなぁ。

投稿2019/06/11 10:50

oikashinoa

総合スコア2826

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問