计算列表中出现在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谢谢,修复了。