在Javascript或Underscore中,我可以计算数组中子串的实例数吗?

Hai*_*ter 1 javascript underscore.js

这必须如此简单,但我无法弄清楚如何计算一系列事物中的子串数.在下划线的任何东西我都错过了吗?

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
Run Code Online (Sandbox Code Playgroud)

这不起作用.

Aln*_*tak 6

假设你不关心重复比赛中的每个数组元素,可以filter在阵列找到匹配的元素:

注意:这是标准的ECMAScript 5功能,而不是下划线.在上面的链接中有旧版浏览器的垫片.

function howManySubstringsInArray(arr, word) {
    return arr.filter(function(v) {
        return v.indexOf(word) >= 0;
    }).length;
}
Run Code Online (Sandbox Code Playgroud)

严格来说,这是创建一个稍微浪费的新数组,因为我们所做的只是计算元素,但对于"小"列表来说无关紧要.

无论如何,裸循环实际上都能很好地工作 - 你只需要确保循环结构正确,并且你实际上看看.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;
}
Run Code Online (Sandbox Code Playgroud)