【问题标题】:Count occurances in string from keyword array in javascript从javascript中的关键字数组计算字符串中的出现次数
【发布时间】:2010-11-26 21:06:46
【问题描述】:

我有一个数组:

var locations = ['Afghanistan','Albania','Algeria','New York'];

还有一个字符串:

var string = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York';

我想计算数组中每个关键字在字符串中出现的次数,但不知道最好的方法。

【问题讨论】:

    标签: javascript regex arrays string count


    【解决方案1】:

    这是我的版本:

    function countItems(a, s) {
        var x, i, output = {};
        for (x = 0; x < a.length; x++) {
            i = 0;
            output[a[x]] = 0;
            while ((i = s.indexOf(a[x], i)) > -1) {
                output[a[x]]++;
                i++
            }
        }
        return output;
    }
    
    var result = countItems(locations, string);
    // result['Albania'] === 0
    

    试试here

    【讨论】:

    • 建议:做一个反向while循环。在处理大字符串和/或大数组时,这应该会加快速度。
    • 这很好用。我唯一改变的是我讨厌 JS 如何处理关联数组,所以我返回一个多维数组: output[keyword,count]
    【解决方案2】:

    试试这样的。你可以修改你对 count 所做的事情——将它存储在另一个数组中,显示它(这就是这个脚本所做的)等等。

    var locations = ['Afghanistan','Albania','Algeria','New York'];
    var str = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York';
    
    
    for(var i=0; i<locations.length; i++) {
        var pattern = new RegExp(locations[i], "g");
        var m = str.match(pattern);
        if (m != null)
        {
           var count = m.length; // the count
           alert("There are " + count + " occurrences of " + locations[i]);
        }
    }
    

    【讨论】:

      【解决方案3】:
      <script language="JavaScript">
      var locations = ['Afghanistan','Albania','Algeria','New York'];
      
      var string1 = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York';
      
      for (var i=0;i<locations.length;i++) {
        nCount = string1.split(locations[i]).length-1;
        document.write(locations[i] + ' is found ' + nCount + ' times<br>');
      }
      
      </script>
      

      【讨论】:

      • 巧妙地使用模式作为分隔符......不过,关于你扔掉数组有点矫枉过正。
      【解决方案4】:

      此代码仅实例化 one RegExp 对象并使用反向 while 循环。我很确定这是在不违反物理定律的情况下尽可能快:)

      这是发生了什么:

      1. 使用反向 while 循环构造正则表达式字符串
      2. 只新建一个 RegExp 对象,并将 match() 放在字符串上
      3. 计算match()函数返回的数组长度

      下面是实现:

      var countries = ["Afganistan", "America", "Island"];
      var sentence = "I love Afganistan, America.. And I love America some more";
      
      function countOccurrences(a, s)
      {
          var re = "",
              l = a.length,
              m;
      
          while (l)
          {
              l--;
      
              re += a[l];
      
              if (l > 0) re += "|";
          }
      
          m = s.match(new RegExp(re, "gi")) || [];
      
          return m.length;
      }
      

      注意:我当然希望对数组中的条目进行清理,以防止任何会破坏函数内构造的正则表达式的特殊字符。

      var occurrences = function countOccurrences(countries, sentence); // returns 3
      

      【讨论】:

      • 这似乎是一个很好的解决方案,但不是我的问题。我想知道每个关键字的计数。不适合所有人。不过谢谢!
      • 啊!误解了你的问题。不过还是谢谢你的夸奖:)
      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2020-05-06
      • 1970-01-01
      • 2013-02-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多