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' } ]