Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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_Arrays - Fatal编程技术网

Javascript 按最大匹配顺序排列字符串匹配结果

Javascript 按最大匹配顺序排列字符串匹配结果,javascript,arrays,Javascript,Arrays,我想搜索字符串中的所有匹配项,并返回按最大匹配结果排序的所有结果,假设我有一些字符串: var strArray = [ "This is my number one string", "Another string that contains number", "Just for example string" ]; // Results of search "another number" should be: var resultArrayOfIndexes = [1, 0]

我想搜索字符串中的所有匹配项,并返回按最大匹配结果排序的所有结果,假设我有一些字符串:

var strArray = [
  "This is my number one string",
  "Another string that contains number",
  "Just for example string"
];

// Results of search "another number" should be:
var resultArrayOfIndexes = [1, 0];
到目前为止,我可以在字符串中搜索,但它返回至少有一个匹配项的所有索引,但我希望结果数组按匹配项的最大计数排序。 我的代码:

函数findMatch(列表、短语){
var preparedList=[],
value=“”;
if(config.get(“list”).match.enabled){
对于(变量i=0,长度=list.length;i
我假设需要不区分大小写的搜索

下面的代码将短语更改为单个单词的数组,然后映射列表以获取
{index:0,matches:1}
形式的对象数组,然后筛选出不匹配的对象,然后排序,然后再次映射以仅获取索引

函数findMatch(列表、短语){
var searchTerms=phrase.toLowerCase().split(/\s+/);
返回列表.map(函数(v,i){
v=v.toLowerCase();
返回{
索引:i,,
匹配:searchTerms.reduce(函数(a,c){
返回a+(v.indexOf(c)!=-1-1:0);
}, 0)
};
})
.filter(函数(v){返回v.matches>0;})
.sort(函数(a,b){返回b.matches-a.matches;})
.map(函数(v){return v.index;});
}
var strArray=[
“这是我的第一个字符串”,“另一个包含数字的字符串”,“仅作为示例字符串”
];

日志(findMatch(strArray,“另一个号码”)我假设需要不区分大小写的搜索

下面的代码将短语更改为单个单词的数组,然后映射列表以获取
{index:0,matches:1}
形式的对象数组,然后筛选出不匹配的对象,然后排序,然后再次映射以仅获取索引

函数findMatch(列表、短语){
var searchTerms=phrase.toLowerCase().split(/\s+/);
返回列表.map(函数(v,i){
v=v.toLowerCase();
返回{
索引:i,,
匹配:searchTerms.reduce(函数(a,c){
返回a+(v.indexOf(c)!=-1-1:0);
}, 0)
};
})
.filter(函数(v){返回v.matches>0;})
.sort(函数(a,b){返回b.matches-a.matches;})
.map(函数(v){return v.index;});
}
var strArray=[
“这是我的第一个字符串”,“另一个包含数字的字符串”,“仅作为示例字符串”
];

日志(findMatch(strArray,“另一个号码”)如果您熟悉正则表达式,可以使用正则表达式匹配短语,还可以计算字符串中匹配的单词数。 假设您还想知道匹配了多少个单词,您可以将其存储为对象数组,其中每个对象存储计数和目标字符串

var strArray = [
    "This is my number one string", "Another string that contains number", "Just for example string"
];

function findMatch(list, phrase){
    var words = phrase.split(" ");

    var pattern = "";
    var length = words.length;
    // create pattern for regex match
    for(var i = 0; i < length; i++){
        pattern += words[i];
        if(i < length-1){
            pattern += "|";
        }
    }

    var counts = [];
    var re = new RegExp(pattern,"g");
    for(var i = 0; i < list.length; i++){
        var count = (list[i].toLowerCase().match(re) || []).length;
        //add to array if matched
        if(count > 0){
            counts.push({count:count,string:list[i]});
        }
    }
    //sort by max match 
    counts.sort(function(a,b){
        return b.count-a.count;
    });

    console.log(counts);
}

findMatch(strArray, "another number");

如果您熟悉正则表达式,可以使用正则表达式匹配短语,也可以计算字符串中匹配的单词数。 假设您还想知道匹配了多少个单词,您可以将其存储为对象数组,其中每个对象存储计数和目标字符串

var strArray = [
    "This is my number one string", "Another string that contains number", "Just for example string"
];

function findMatch(list, phrase){
    var words = phrase.split(" ");

    var pattern = "";
    var length = words.length;
    // create pattern for regex match
    for(var i = 0; i < length; i++){
        pattern += words[i];
        if(i < length-1){
            pattern += "|";
        }
    }

    var counts = [];
    var re = new RegExp(pattern,"g");
    for(var i = 0; i < list.length; i++){
        var count = (list[i].toLowerCase().match(re) || []).length;
        //add to array if matched
        if(count > 0){
            counts.push({count:count,string:list[i]});
        }
    }
    //sort by max match 
    counts.sort(function(a,b){
        return b.count-a.count;
    });

    console.log(counts);
}

findMatch(strArray, "another number");

如果其中一个
strArray
元素有两次“number”这个词,这算两次匹配吗?哈,好问题!我认为没有,这是为了产品搜索的目的,所以只有一个匹配就足够了。问题是max unique匹配必须是第一个。如果
strArray
元素中的一个元素有两个单词“number”,那么这算两个匹配吗?哈,好问题!我认为没有,这是为了产品搜索的目的,所以只有一个匹配就足够了。问题是最大唯一匹配数必须是第一个。
[ { count: 2, string: 'Another string that contains number' },
  { count: 1, string: 'This is my number one string' },
  { count: 0, string: 'Just for example string' } ]