如何检查字符串或数组中单词的多次出现

时间:2019-05-09 20:23:26

标签: javascript

我需要获取字符串中指定的一组重复单词的计数。

我可以返回一个单词的出现,但我卡在多个单词中。

const sData = 'am=1&am=2&pm=1&pm=2&pm=3&ac=1&dc=1';
const aData = sData.split('&');

const nData = aData.filter(el => el.includes('am')).length;

这返回预期的2,但是我需要对pmacdc进行同样的操作,据我了解,includes不接受多个值。

4 个答案:

答案 0 :(得分:2)

您可以使用功能

const countOccurrencesOf = (word, search) => {
  return word.filter(el => el.includes(search)).length;
};

现在,您可以重复使用此功能来满足其他所有查找字符串的需求:

countOccurrencesOf(aData, 'pm');
countOccurrencesOf(aData, 'ac');
countOccurrencesOf(aData, 'dc');

答案 1 :(得分:1)

您正在寻找的是递归函数。在您提供的示例中,我假设您正在解析URL查询变量。因此,让我们假设以下是您的分隔符:&或=。

此功能可以大致了解您想要达到的目标。

 function containsDuplicates(string,delimiter,foundDuplicates){
    var str = string.split(delimiter);

    if(foundDuplicates.includes(str)){
        return true;
    }else if(string.indexOf(str) < string.length){
        foundDuplicates.push(str);
        return containsDuplicates(string,delimiter,foundDuplicates);
    }
    else{
        return false;
    }
}

答案 2 :(得分:1)

尝试改用地图:

const sData = 'am=1&am=2&pm=1&pm=2&pm=3&ac=1&dc=1';
const aData = sData.split('&');

// define the stings you want to count
const nData = {am: 0, pm: 0, ac: 0}

// iterate over the split input data
const val = aData.map((obj) => {
    // iterate over the nData
    Object.keys(nData).forEach((count) => {
        // if the input contains the count, add to the count
        if (obj.includes(count)) nData[count]++;
    })
})
console.log(nData); // returns: { am: 2, pm: 3, ac: 1 }

减少可能也会起作用!

答案 3 :(得分:1)

  • 创建要查找的关键字数组。
  • 通过用|分隔单词来创建正则表达式。
  • 使用match获取指定关键字的所有匹配项。
  • 创建一个counter对象。遍历匹配数组并计算每次出现的次数

const str = 'am=1&am=2&pm=1&pm=2&pm=3&ac=1&dc=1',
      toFind = ['am', 'pm', 'ac'],
      regex = new RegExp(toFind.join("|"), "g"),
      matches = str.match(regex);

console.log(matches)

const counter = {};
matches.forEach(m => counter[m] = counter[m] + 1 || 1)

console.log(counter)
.as-console-wrapper { max-height: 100% !important; top: 0; }