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 回答