在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答案上的注释)。