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

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

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

Lodashは、JavaScriptのユーティリティライブラリ。Underscoreの派生ライブラリで、配列・オブジェクトの操作に便利です。また、コードの可読性も高めることができます。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

3601閲覧

jQueryで配列の語句を前方一致させたい

toramo

総合スコア14

Lodash

Lodashは、JavaScriptのユーティリティライブラリ。Underscoreの派生ライブラリで、配列・オブジェクトの操作に便利です。また、コードの可読性も高めることができます。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/05/10 15:41

編集2018/05/13 04:51

実現したいこと

こんにちは。恐らく初歩中の初歩のような質問になりますがよろしくお願いいたします。
配列に記入した語句をもとに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」の関数内に
カッコを入れ替えたりしてペーストしてみたのですが思うように動きません。

最初の関数内に前方一致の条件も付け加えることは可能でしょうか。
教えていただきたく思います。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

最初の関数内に文頭一致の条件も付け加えることは可能でしょうか。

startsWith
https://lodash.com/docs/4.17.4#startsWith

「文頭一致」は前方一致が正しいですね。

Re: toramo さん

投稿2018/05/10 23:09

編集2018/05/10 23:11
think49

総合スコア18162

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

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

toramo

2018/05/13 04:56 編集

回答ありがとうございます。 前方一致ですね。不勉強で申し訳ないです。本文を修正しました。 startsWithの項目を読みました。 恐らく、前方一致させたい配列をもう一つvar ranges2などにして表記した上で if文で0文字目からstartsWithしてたらranges2の方の式、elseでrangeの式とすれば 一つの関数内で収まるんだろうな、というぼんやりとした道筋は分かりました。 ただ、申し訳ないのですがその関数を正しく表記できる力がまだ無かったため、 今回は別の方の関数をそのまま使わせていただきました。 しかし今後似たような場面に遭遇した際にこのstartsWithも使いこなせるように精進します。 お手数おかけしました。
guest

0

ベストアンサー

Answer書き直しました。

javascript

1const _ = require('lodash') 2 3function filterBydesc (value) { 4 return value == '' 5 ? _.constant(true) 6 : function (item) { 7 var ranges = { 8 1: { desc: 'いう' }, 9 2: { desc: 'うえ' }, 10 3: { desc: 'かい' }, 11 4: { desc: '^あい' } // <---- 条件追加しました。 12 } 13 var range = ranges[value] 14 return _.some(range, function (descword) { 15 return _.some(item.desc, function (word) { 16 return !!word.match(descword) // <---- ここを書き換えました。 17 }) 18 }) 19 } 20} 21 22/* 動作確認用 */ 23console.log(filterBydesc('1')({ desc: { word: 'あいうえお' } })) // true 24console.log(filterBydesc('2')({ desc: { word: 'あいうえお' } })) // true 25console.log(filterBydesc('3')({ desc: { word: 'あいうえお' } })) // false 26 27/* 本題 */ 28console.log(filterBydesc('4')({ desc: { word: 'あいうえお' } })) // true 29console.log(filterBydesc('4')({ desc: { word: '___あいうえお' } })) // false

_.includes('foobar', 'foo')は単に true か false を返すので、このケースでは lodash にこだわる必要なさそうでした。
'foobar'.match('^foo')とすると正規表現込みのマッチングが行われるので、これを使うと良いと思います。

javascript

1'foobar'.match('^foo') // [ 'foo', index: 0, input: 'foobar' ] 2'___foobar'.match('^foo') // null

このままだと返す値が若干怪しいので、!!を適用して true か false にしてから返すと良いと思いました。

javascript

1!!'foobar'.match('^foo') // true 2!!'___foobar'.match('^foo') // false

投稿2018/05/10 16:18

編集2018/05/12 15:13
set0gut1

総合スコア2413

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

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

toramo

2018/05/11 14:27

回答ありがとうございます。 こちらの式に変更しても、正しく動作することができました。 しかし、この条件に加えて 「1: {desc: "いう"}, 2: {desc: "うえ"}, 3: {desc: "かい"},」 などの部分一致の条件を同時に成立させたいのです。 説明不足で申し訳ありません。
set0gut1

2018/05/11 20:09

「nameで前方一致し、かつdescで部分一致させるレコードを探す」ということでしょうか?
toramo

2018/05/12 14:45

何度も有難うございます。こちらの表現不足でお手を煩わせてしまいすみません。 1〜4のdescが同じ変数内に配列として並んでいるときに、 1・2・3のdescは部分一致させ、4の「あいうえお」というdescのみ前方一致させたい、という意味で質問させていただきました。 なんとなく、同じ変数内では出来ないのでは?と考え 123と4の配列をそれぞれ別の変数として定義して、 上の方に教えていただいたstartsWithを絡めたif文を作ればいいのではないかと思ったのですが (全くの素人考えのためズレていたらすみません) その構文が正しく書けないため手詰まっています。
set0gut1

2018/05/12 14:51

把握しました!Answer修正しようと思います。
toramo

2018/05/13 04:54

有難うございました! 修正していただいた回答のお陰で、無事に前方一致させることが出来ました! ドロップダウンを変更して正しい人数に絞り込めたのを見た時に本当にホッとしました。 教えていただいた表現を自分で調べながら学んでみようと思います。 今回は大変お世話になりました。
set0gut1

2018/05/13 04:55

おめでとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問