jQuery 質問スレッド vol.7 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
JavaScriptでDOM用ライブラリであるjQueryのスレです。
このスレはjQueryやjQuery UIの使い方やjQueryプラグインの作り方を質問するスレです。
jQueryを使って作る側のスレであって、こんなプラグインありませんか?と聞くスレではありません。
そういうのは自分で探してください。
ろくにサポートもされてなさそうな野良プラグインの使用はおすすめしません。
JavaScriptの質問は関連スレで質問して下さい。
■前スレ
+ JavaScript & jQuery 質問用スレッド vol.6 +
http://echo.2ch.net/test/read.cgi/hp/1465566635/
■関連スレ
+ JavaScript の質問用スレッド vol.122 +
http://echo.2ch.net/test/read.cgi/tech/1472426483/
+ JavaScript(ECMAScript)質問用スレッド vol.122 +
http://echo.2ch.net/test/read.cgi/tech/1472401404/
+ JavaScript の質問用スレッド vol.131 +
http://echo.2ch.net/test/read.cgi/hp/1478053599/
JavaScript ライブラリ総合質問所 vol.5 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1465399470/
+ JavaScript & jQuery 質問用スレッド vol.6 +
http://echo.2ch.net/test/read.cgi/hp/1465566635/ >>992
まず最初に、wordsの名前が良くなかった。keywordsという名前に変更する
https://jsfiddle.net/3cnkcyjk/15/
最後の行、コードが重複してるなーって思っていたわけよ
(同様に word も keyword に変更している)
_.includes(item.title, keyword) || _.includes(item.description, keyword);
この部分。_.includesが二回でてる。keywordが二回出てる。気に食わない。
が、二回程度なら諦めるか。でこういうコードにした。
そこに今回さらにdescriptionが配列になる(descriptions)わけでもっと複雑になるわけだ
じゃあここで発想を変えよう。
最終的には、titleかdescriptions[0]かdescriptions[1]かdescriptions[N]のどれかに
入っていればOKということになるわけだ。
ってことはだ。
words = [item.title, item.descriptions[0], item.descriptions[1],...,item.descriptions[N]]
という配列を作っておき、この配列の文字列の何処かに含まれていればOKってことになるわけだよ。
あとは、wordsの配列の中のword文字列の中にkeywordが含まれているか?
ということで、
_.includes(item.title, keyword) || _.includes(item.description, keyword);
と等価なのは
var words = [item.title, item.description];
return _.some(words, function(word) { return _.includes(word, keyword) });
ということになる。
https://jsfiddle.net/3cnkcyjk/16/ ただよ? これでも動くけど
これってkeywords(入力されたキーワードをスペース区切りって作った)配列と
[title, descriptiuon] 配列の全部の組み合わせを・・・
ここで気づいた。lodashにproduct関数ねぇのかよ!
例えば、["title", "description"] に ["a", "i"]のいずれかが含まれているか?っていうのは
2つの配列の全組み合わせ
"title" include? "a"
"title" include? "i"
"description" include? "a"
"description" include? "i"
となるわけだよ。これをproductとかいう関数に食わせれば話は早いんだが、ないなら仕方ない。
とりあえず今回は、順番を変えるだけで済ませよう。
return _.some(keywords, function(keyword) {
return _.some(words, function(word) {
return _.includes(word, keyword)
});
});
これでkeywordsとwordsの総当りに対して、includesを実行することになるわけだ。
https://jsfiddle.net/3cnkcyjk/17/ あとは、wordsの部分だけだな
var words = [item.title].concat(item.description);
これだけでOK
ついでにkeywordsに分割する部分の正規表現が無駄だったので修正
https://jsfiddle.net/3cnkcyjk/19/
ついでにこの_.escapeはいらないと思うので削除
https://jsfiddle.net/3cnkcyjk/20/
あとやっぱりproduct使わないと見づらいので
https://www.npmjs.com/package/lodash.product つかった
https://jsfiddle.net/3cnkcyjk/21/
そしてfilterByKeyword関数だけES6にしてみた
https://jsfiddle.net/3cnkcyjk/22/ 本当にありがとうございます
月並みな感謝の気持ちしか書けず申し訳ないです
全てを理解できるレベルには達していませんが一つ一つページ確認させてもらいました
参考にしてようやくやりたかった内容が完成しました
キーワード検索もバッチリで気持ちがいいです
(他板のスレに投稿したところスレ住民も便利だと喜んでくれました)
大変お世話になりました、ありがとうございました ∧,,,∧
( ・∀・) 1000ならジュースでも飲むか
( )
し─J このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 363日 17時間 52分 5秒 レス数が1000を超えています。これ以上書き込みはできません。