Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从javascript中的关键字数组中计算字符串中的发生次数_Javascript_Regex_Arrays_String_Count - Fatal编程技术网

从javascript中的关键字数组中计算字符串中的发生次数

从javascript中的关键字数组中计算字符串中的发生次数,javascript,regex,arrays,string,count,Javascript,Regex,Arrays,String,Count,我有一个数组: var locations = ['Afghanistan','Albania','Algeria','New York']; 和一个字符串: var string = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York'; 我想计算数组中每个关键字在字符串中出现的次数,但无法找出最佳方法。尝试类似的方法。您可以修改如何使用count——将它存储在另一个数组中,显示它(这就是这个脚

我有一个数组:

var locations = ['Afghanistan','Albania','Algeria','New York'];
和一个字符串:

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

我想计算数组中每个关键字在字符串中出现的次数,但无法找出最佳方法。

尝试类似的方法。您可以修改如何使用
count
——将它存储在另一个数组中,显示它(这就是这个脚本所做的),等等

var位置=[“阿富汗”、“阿尔巴尼亚”、“阿尔及利亚”、“纽约”];
var str=‘我爱阿富汗纽约阿富汗安道尔安道尔阿尔及利亚纽约’;
对于(变量i=0;i

var位置=[“阿富汗”、“阿尔巴尼亚”、“阿尔及利亚”、“纽约”];
var string1=‘我爱阿富汗纽约阿富汗安道尔安道尔阿尔及利亚纽约’;
对于(var i=0;i,以下是我的版本:

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
函数countItems(a,s){
变量x,i,输出={};
对于(x=0;x-1){
输出[a[x]]++;
我++
}
}
返回输出;
}
var结果=countItems(位置、字符串);
//结果['albana']==0

试试看。

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

这就是正在发生的事情:

  • 使用反向while循环构造正则表达式字符串
  • 新建一个RegExp对象,并在字符串上匹配它
  • 计算
    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;
    }
    
    注意:我当然希望数组中的条目被清除掉任何特殊字符,这些字符将破坏函数中构造的正则表达式


    建议:做一个反向while循环。当处理一个大字符串和/或一个大数组时,这应该会加快速度。这很好。我唯一改变的是我讨厌JS如何处理关联数组,所以我返回一个多维数组:output[关键字,count]巧妙地将模式用作分隔符…但是,对于您扔掉数组来说,这有点过头了。这似乎是一个很好的解决方案,但不是解决我的问题。我想知道每个关键字的计数。不是全部。谢谢!啊!误解了您的问题。不过,谢谢您的赞美:)
    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
    
    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