私はlodashを学んでいます。 lodashを使用して文字列の配列内の部分文字列を見つけることは可能ですか?
var myArray = [
'I like oranges and apples',
'I hate banana and grapes',
'I find mango ok',
'another array item about fruit'
]
wordの「オレンジ」が配列内にあるかどうかを確認することはできますか?私は_.includes、_。some、_。indexOfを試しましたが、サブストリングではなく完全なストリングを見るためにすべて失敗しました
some() の反復子は、lodashの高階関数を使用して簡単に構築できます。例えば:
__.some(myArray, _.unary(_.partialRight(_.includes, 'orange')));
_
nary() 関数は、1つの引数のみがコールバックに渡されるようにします。 partialRight() 関数は、 includes() の2番目の引数として_'orange'
_値を適用するために使用されます。最初の引数は、some()
の各反復で提供されます。
ただし、大文字と小文字の区別が重要な場合、このアプローチは機能しません。たとえば、_'Orange'
_はfalseを返します。大文字と小文字を区別する方法は次のとおりです。
__.some(myArray, _.method('match', /Orange/i));
_
method() 関数は、渡された最初の引数の指定されたメソッドを呼び出す関数を作成します。ここでは、大文字と小文字を区別しない正規表現と照合しています。
または、大文字と小文字が区別されず、単にmethod()
アプローチを好む場合、これはES2015でも同様に機能します。
__.some(myArray, _.method('includes', 'orange'));
_
2つの簡単な方法-どちらもlodashを使用しません(ごめん)
var found = myArray.filter(function(el){
return el.indexOf('oranges') > -1;
}).length;
if (found) { // oranges was found }
またはコメントで述べたように:
var found = myArray.join(',').indexOf('oranges') > -1;
if (found) { // oranges was found }
Lodashを使用してこれを行うことができますが、ネイティブjavascriptメソッドを使用しても非常に実行可能です。
function stringArrayContains(array, str) {
function contains(el) {
return (el.indexOf(str) !== -1) ? true : false;
}
return array.some(contains);
}
上記の機能のテスト:
var a = ['hello', 'there'];
var b = ['see', 'ya', 'later'];
stringArrayContains(a, 'ell') // true
stringArrayContains(a, 'what') // false
stringArrayContains(b, 'later') // true
stringArrayContains(b, 'hello') // false
Array.prototype.someは、定義した関数を配列のすべての要素に適用します。この関数(名前はcontains)はtrueまたはfalseを返す必要があります。配列要素を反復処理しているときに、いずれかの要素がtrueを返す場合、someメソッドはtrueを返します。
個人的には、単純な関数にネイティブJSメソッドを使用できる場合、同じことをするためだけにライブラリをロードする方が望ましいと一般的に考えています。 Lodashにはパフォーマンス上の利点がありますが、大量のデータを処理しない限り、必ずしも実現するわけではありません。ちょうど私の2セント。
乾杯!
最良の方法は、サブストリングの包含をチェックする関数を定義することです。
var contains = _.curry(function (substring, source) {
return source.indexOf(substring) !== -1;
});
私が使う _.curry
ここでカリー化された関数を取得します。この関数は部分的に適用できます。
_.some(myArray, contains('item'));
結合された文字列で部分文字列を見つけることもできます。
contains('item', _.join(myArray))
UPD:
Lodashには、コレクション内の値を検索する機能が既にあることに気付いていません。
関数 _.includes
は、上で定義したものとまったく同じです。ただし、すべてがlodashであるため、引数の順序は異なります。この例では、カリー化された関数の最新の引数としてソースを配置します。これにより、lodashが同じ関数の最初の引数としてソースを待機するときに、ポイントフリースタイルのプログラミングに役立ちます。
この問題に関するブライアンロンズドルフの講演を確認してください https://www.youtube.com/watch?v=m3svKOdZijA
また、 ramda を調べるチャンスもあります。このライブラリは、JavaScriptでの実用的な関数型プログラミングのためのより良い方法を提供します。
配列内の各文字列に対して部分文字列を照合し、その部分文字列を含む配列項目を削除するの方法を見つけようとしているときに、この質問/回答スレッドに遭遇しました。
上記の答えは私を軌道に乗せますが、これは元の質問に具体的に答えていませんが、このスレッドは、配列項目の上記の削除を達成する方法を見つけようとしているときにGoogle検索で最初に表示されますここに答えを投稿します。
次のように、一致する配列文字列を削除するためにLodashの_.remove関数を使用する方法を見つけることになりました。
// The String (SubString) we want to match against array (for dropping purposes)
var searchSubString = "whatever"
// Remove all array items that contain the text "whatever"
_.remove(my_array, function(searchSubString) {
return n.indexOf(searchSubString) !== -1;
});
基本的に、indexOfは文字列内の部分文字列の位置と一致します。部分文字列が見つからない場合、indexOfが-1以外の数を返すと、-1を返します(数字は、配列文字列内の文字数におけるSubStringの位置です) )。
Lodashは配列の変更によってその配列項目を削除し、新しく変更された配列には同じ名前でアクセスできます。