あなたが尋ねたので、減らし:
let count = Array.prototype.reduce.call(input, (counter, chr) => (counter + (match.indexOf(chr)!==-1 ? 1: 0)), 0)
更新:
他の回答についてのコメントをもとに、OPはまた、個々の文字に加えて、「ABC」のような部分文字列を検索する機能をしたいと思います。ここでは、ローカルモジュールに入れることができるより洗練されたソリューションを紹介します。
一緒に機能する2つの機能があります.1つは一致する特殊文字をエスケープし、もう1つはカウントします。あなたは、配列
const match = ['&', '|', '-'];
const input = 'This, & That | Or | THIS - Foo';
let res = match
.map(v => [...input].filter(c => c === v).length)
.reduce((a, b) => a + b)
console.log(res);
の結果としての要素を追加するチェーン.reduce()
で、.map()
、.filter()
を使用することができますし、再び減らす使用して...
// This escapes characters
const escapeRegExp = (str) => (
str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")
)
// This returns the count
const countMatches = (input, match, i = true) => (
match.reduce((c, pattern) => (
c + input.match(new RegExp(escapeRegExp(pattern), (i ? 'ig' : 'g'))).length
), 0)
)
// OP's test case
let match = ['&', '|', '-'],
input = 'This & That | Or | THIS - Foo',
count = countMatches(input, match)
console.log('Expects 4: ', count, 4 === count)
// Case Sensitive Test
match = ['abc']
input = 'This ABC & That abc | Or | THIS - Foo'
count = countMatches(input, match, false)
console.log('Expects 1: ', count, 1 === count)
// Case Insensitive Test
count = countMatches(input, match)
console.log('Expects 2: ', count, 2 === count)
あなたはどのような努力をしてきましたか? –
は、今までに一文字にしかならない一致オプションですか?マッチングにとって重要なケースですか?(すなわち 'T =/= t') – haxxxton
いいえ、それは1つのマッチの文字列であるかもしれません。 – chovy