如果我有这个数组
const arr1 = ["cat", "I love cats and I have many cats", "dog"]
并运行
arr1.filter(s => s.includes("cat")).length;
结果为 2,因为“cat”包含在 2 个条目中,但有没有办法使结果等于 3?这意味着将计算单词的出现次数,而不是条目。
答案 0 :(得分:2)
按搜索值拆分字符串。结果将是一个包含比实例数多一个的数组。以这种方式迭代数组中的每个字符串并相应地对计数求和。
const countInstances = (value, arr) => arr.reduce(
(a,v) => a += v.split(value).length-1
, 0);
console.log(countInstances('cat', ["cat", "I love cats and I have many cats", "dog"]));
不明显的一点是,如果要拆分的字符串位于要拆分的字符串的开头/结尾,则结果在该结尾处包含一个空字符串:
'something cat'.split('cat'); // ['something ', '']
'cat something'.split('cat'); // ['', ' something']
'cat'.split('cat') // ['', '']
参考:
答案 1 :(得分:0)
您可以使用正则表达式来搜索多次出现。但是如果搜索词只想是任意字符串,就不必担心正则表达式的转义。您可以使用 indexOf 创建一个简单的计数函数。然后你可以在 reduce to sum 中使用它。
const arr1 = ["cat", "I love cats and I have many cats", "dog"];
function count(str, search) {
let p = 0, c = 0;
while (true) {
i = str.indexOf(search, p);
p = i + 1;
if (i >= 0) c ++;
else break;
}
return c;
}
console.log(
arr1.reduce((a,v) =>
a += count(v, 'cat'), 0));
答案 2 :(得分:0)
您可以在空格上拆分以获取单词,然后搜索您的单词。
const arr1 = ["cat", "I love cats and I have many cats", "dog"],
searchWord = 'cat',
frequency = arr1.reduce((count, str) => {
const words = str.split(' ');
const matchedWord = words.filter(word => word.includes(searchWord));
return count + matchedWord.length;
},0);
console.log(frequency);
答案 3 :(得分:-1)
您可以使用正则表达式匹配来查找所有匹配项,然后对其进行计数以获得总长度。
let count=0;
const arr1 = ["cat", "I love cats and I have many cats", "dog"]
arr1.forEach(s=>{count+=(s.match(/cat/g)||[]).length})
print(count)