Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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 - Fatal编程技术网

计算列表中出现在javascript字符串中的项目的出现次数

计算列表中出现在javascript字符串中的项目的出现次数,javascript,Javascript,我希望能够指定一个字符/字符串列表,并找出列表中有多少出现在给定字符串中 const match = ['&', '|', '-', 'abc']; const input = 'This & That | Or | THIS - Foo abc'; 结果应返回5 我可以循环匹配并使用计数器执行indexOf,但我想知道是否有更简单的方法使用reduce而不是循环match数组,您可以拆分输入字符串,过滤它,然后获得长度 下面是一个简单的单行程序: input.split(''

我希望能够指定一个字符/字符串列表,并找出列表中有多少出现在给定字符串中

const match = ['&', '|', '-', 'abc'];
const input = 'This & That | Or | THIS - Foo abc';
结果应返回
5


我可以循环匹配并使用计数器执行
indexOf
,但我想知道是否有更简单的方法使用
reduce

而不是循环
match
数组,您可以拆分
输入
字符串,过滤它,然后获得长度

下面是一个简单的单行程序:

input.split('').filter(x => match.indexOf(x) > -1).length;
片段:

const match=['&','|','-'];
常量输入='This&That |或| This-Foo';
const count=input.split(“”).filter(x=>match.indexOf(x)>-1).length;

console.log(计数);//4
您可以使用regexp查找匹配字符:

function escape(chr) { return '\\' + chr; }

input.match(new RegExp(match.map(escape).join('|'), "g")).length

转义是必要的,以避免诸如在regexp中具有特殊含义的字符出现问题。

,因为您要求reduce:

let count = Array.prototype.reduce.call(input, (counter, chr) => (counter + (match.indexOf(chr)!==-1 ? 1: 0)), 0)
更新:

根据对其他答案的评论,OP希望除了单个字符外,还能够搜索诸如“abc”之类的子字符串。这里有一个更优雅的解决方案,可以放在本地模块中

有两个函数一起工作:一个用于转义匹配中的特殊字符,另一个用于计数。再次使用reduce


//这逃避了角色
const escapeRegExp=(str)=>(
str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^\$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
)
//这将返回计数
const countMatches=(输入,匹配,i=true)=>(
匹配.reduce((c,模式)=>(
c+input.match(新的RegExp(escapeRegExp(模式),(i?'ig':'g')).length
), 0)
)
//OP的测试用例
让match=['&','|','-'],
输入='This&That |或| This-Foo',
计数=计数匹配(输入,匹配)
log('需要4:',计数,4==计数)
//区分大小写测试
匹配=['abc']
输入='This ABC&That ABC |或| This-Foo'
count=countMatches(输入、匹配、false)
log('需要1:',计数,1==计数)
//不区分大小写测试
计数=计数匹配(输入,匹配)
console.log('expected 2:',count,2===count)
您可以使用
.map()
.filter()
,并将
.reduce()
链接以添加结果数组的元素

const match=['&','|','-'];
常量输入='This,&That |或| This-Foo';
让res=匹配
.map(v=>[…输入].filter(c=>c==v).length)
.减少((a,b)=>a+b)

控制台日志(res)你做了哪些努力?匹配选项是否只会是一个字符?案例对匹配是否重要?(即,
T=/=T
)不,它可能是一个匹配的字符串。如果
match
数组由
['&'、'|'、'-'、'-'、'#']
等值组成,则它将抛出错误
/[&-#]/:Range在字符类中无序,因为
|-#
被解释为一个范围,因为它位于字符类内部。。。如果使用此方法,则需要转义这些值<代码>['\\&'、'\\\\'、'\\-'、'\\\\\\']
@JoshCrozier谢谢,修复了。