Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript或下划线中,我可以计算数组中一个子字符串的实例数吗?_Javascript_Underscore.js - Fatal编程技术网

在Javascript或下划线中,我可以计算数组中一个子字符串的实例数吗?

在Javascript或下划线中,我可以计算数组中一个子字符串的实例数吗?,javascript,underscore.js,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; } howManySubstringsInArra

这一定很简单,但我不太明白如何计算数组中的子字符串数。有没有我遗漏的下划线

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

这不起作用。

您的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);
}

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);
}

假设您不关心每个数组元素中的重复匹配,您可以使用数组查找匹配元素:

注意:这是一个标准的ECMAScript 5函数,不是来自下划线。在上面的链接中有一个用于旧浏览器的垫片

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;
}
函数howManySubstringsInArray(arr,word){
变量i=0,n=arr.length,count=0;
对于(;i=0){
++计数;
}
}
返回计数;
}

假设您不关心每个数组元素中的重复匹配,您可以使用数组查找匹配元素:

注意:这是一个标准的ECMAScript 5函数,不是来自下划线。在上面的链接中有一个用于旧浏览器的垫片

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;
}
函数howManySubstringsInArray(arr,word){
变量i=0,n=arr.length,count=0;
对于(;i=0){
++计数;
}
}
返回计数;
}
如果需要,请将$each更改为for



如果需要,请将$.each更改为for。

签出:它是否应该在一个单词中匹配多个子字符串?您应该使用
arr[--i]。indexOf(word)!=-1
签出:它是否应该在一个单词中匹配多个子字符串?您应该使用
arr[--i]。indexOf(word)!=-1
这将丢失同一字符串中的重复,例如“bedded”。先生们,说得好。我不打算在同一个元素中检查重复,每个元素只检查一次就可以了。@Hairgami_Master:啊,好吧,那就是了。别忘了ES5内置的
数组。prototype.reduce
@Alnitak他问到标题中的下划线,所以他可能已经有了。否则,他将不得不为垫片添加更多代码。不过在一般情况下,我同意。这将错过相同字符串中的重复,例如“bedded”。先生们,说得好。我不打算在同一个元素中检查重复,每个元素只检查一次就可以了。@Hairgami_Master:啊,好吧,那就是了。别忘了ES5内置的
数组。prototype.reduce
@Alnitak他问到标题中的下划线,所以他可能已经有了。否则,他将不得不为垫片添加更多代码。但在一般情况下,我同意。这将丢失同一字符串中的重复,例如“bedded”。是的,但OP正在寻求代码方面的帮助,知道它是错误的。是的,但是OP的代码是错误的,因为他没有检查
indexOf
的结果-他从不尝试迭代每个字符串。如果OP指示字符串中的重复是否重要,这可能会很有用。看起来OP不关心同一字符串中的重复(参见loganfsmyth答案上的注释).这将丢失同一字符串中的重复,例如“bedded”。是的,但OP正在寻求代码方面的帮助,知道它是错误的。是的,但是OP的代码是错误的,因为他没有检查
indexOf
的结果-他从不尝试迭代每个字符串。如果OP指示字符串中的重复是否重要,这可能会很有用。看起来OP不关心同一字符串中的重复(请参阅loganfsmyth答案上的注释)。