実現したいこと
こんにちは。恐らく初歩中の初歩のような質問になりますがよろしくお願いいたします。
配列に記入した語句をもとにhtmlの内容を絞り込みたいのですが、
前方一致させたいものが部分一致のものと混ざってしまい困っています。
javascriptやhtmlの元データは前回同様こちらを参考にしています。
また、lodash.jsが必要になります。
発生している問題
javascript
1var Lists= [ 2 { name: 'あいうえお', hobby: [['趣味1', '30', 'あいうえお'], ['趣味2', '20', 'いうええ'], ['趣味3', '40', 'うえお']]}, 3 { name: 'かきくけこ', hobby: [['趣味1', '50', 'かいう'], ['趣味2', '30', 'うえこあいうえお'], ['趣味3', '40', 'くあい'], ['趣味4', '40', 'けえこ']]} 4 { name: 'さしすせそ', hobby: [['趣味1', '20', 'いうさ'], ['趣味2', '40', 'しかい']]} 5];
のような配列がある時にhtml側のドロップダウンリストを使って絞り込みをしたいのですが、今までは
javascript
1function filterBydesc(value) { 2 return (value == "") ? _.constant(true) : function(item) { 3 var ranges = { 4 1: {desc: "いう"}, 5 2: {desc: "うえ"}, 6 3: {desc: "かい"}, 7 }; 8 var range = ranges[value]; 9 return _.some(range, function(descword) { 10 return _.some(item.desc, function(word) { 11 return _.includes(word, descword); 12 }); 13 }); 14 }; 15 }
のように記述することで、その語句を含む人物を取り出すことができました。
しかし、絞り込みの条件を考える中でどうしても「あいうえお」で始まる人のみ絞り込みたくなったのですが
そのままだと「うえこあいうえお」を持つかきくけこさんも結果に表示されてしまいます。
試したこと
前方一致の正規表現というものを知ったので
javascript
1 4: {desc: ^"あいうえお"}, 2 4: {desc: "^あいうえお"}, 3 4: {desc: ^あいうえお\},
上記の式にこの3パターンをそれぞれ付け足して試してみましたが
一番上はエラーとなり表示されず、二番目と三番目は「当てはまる人物は0名です」となりました。
そこで
javascript
1function filterBydesc2(value) { 2 return (value == "") ? _.constant(true) : function(item) { 3 var ranges = { 4 1: {desc: "あいうえお"}, 5 }; 6 var range = ranges[value]; 7 return _.some(range, function(descword) { 8 return _.some(item.desc, function(word) { 9 if (word.indexOf(descword) === 0){ 10 return _.includes(word, descword); 11 }; 12 }); 13 }); 14 }; 15 }
と別個に関数を作成したところ、きちんとあいうえおさんのみ表示してくれました。
しかし1つのドロップダウンを変更した時にどちらの絞り込みもしたいので、
どうにか上の関数にこの表現を入れ込めないかと最初の「filterBydesc」の関数内に
カッコを入れ替えたりしてペーストしてみたのですが思うように動きません。
最初の関数内に前方一致の条件も付け加えることは可能でしょうか。
教えていただきたく思います。よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/13 04:56 編集