1

これは非常に単純なはずですが、ものの配列内の部分文字列の数を数える方法がよくわかりません。これについてアンダースコアに欠けているものはありますか?

var foo = ["fred", "ted", "medical", "car"]

function howManySubstringsInArray(arr, word){
    var i = arr.length,
    j = 0;
    while (i) if (arr[--i].indexOf(word))++j;
    return j;
}

howManySubstringsInArray(foo, 'ed')
Output => 3

これは機能していません。

4

3 に答える 3

6

各配列要素内で繰り返し一致することを気にしないと仮定するとfilter、配列で一致する要素を見つけることができます。

注意: これは標準の ECMAScript 5 関数であり、アンダースコアからのものではありません。上記のリンクには、古いブラウザ用の shim があります。

function howManySubstringsInArray(arr, word) {
    return arr.filter(function(v) {
        return v.indexOf(word) >= 0;
    }).length;
}

厳密に言えば、これは新しい配列を作成することであり、要素を数えるだけなので少し無駄ですが、「小さな」リストの場合は問題になりません。

とにかく、裸のループは実際にはかなりうまく機能します。ループが正しく構造化されていることを確認し、実際に.indexOf呼び出しの結果を確認する必要があるだけです。既存の後方反復により、ループ条件を必要以上に追跡することが難しくなります。

function howManySubstringsInArray(arr, word) {
    var i = 0, n = arr.length, count = 0;
    for ( ; i < n; ++i) {
        if (arr[i].indexOf(word) >= 0) {
             ++count;
        }
    }
    return count;
}
于 2013-03-28T15:18:43.477 に答える
3

while ループで実際のインデックスを確認する必要があります。

 while (i) if (arr[--i].indexOf(word) !== -1) ++j;

ここでもうまく使用できreduceます:

function howManySubstringsInArray(arr, word){
  return _.reduce(arr, function(count, val){
    return count + (val.indexOf(word) === -1 ? 0 : 1)
  }, 0);
}
于 2013-03-28T15:18:41.663 に答える
-1
function howManySubstringsInArray(arr,str)
{
var count=0;
   $.each(arr,function(i,item)){
   if(item.indexOf(str)!=-1)
    {
      count ++;
    }
  });
 return count;
}

必要に応じて $.each を for に変更します。

于 2013-03-28T15:21:01.820 に答える