我正在尝试找到检查字符串是否为
的最佳方法有什么想法吗?
示例数据:
var stringExample = "application Name";
var arrayExample = ['app', 'application', 'name'];
伪装:
for (var i = 0; i < arrayExample.length; i++) {
if (stringExample.toLower() == arrayExample[i]) {
return true;
} elseif (stringExample.toLower() == "Any Combination of array values with spaces or
without spaces in between") { return true };
}
答案 0 :(得分:1)
很显然,输入字符串中的一个单词可能需要两个或多个数组元素的串联才能被视为匹配项。这可能是要求中最棘手的部分。
第二,似乎一旦单词与数组值(或数组值)匹配,这些数组元素就不应再用于其他匹配。
我建议使用一个普通对象将数组值存储为属性。这将允许快速查找,并且删除(为了满足上述第二点)也可以非常有效地完成。为了实现第一个要求,我会坚持使用蛮力方法。另外,您可以构建一个suffix tree,但是要想从中受益,您需要大量的投入,因此我不建议这样做。
找到单词(一部分)的潜在匹配项之后,您可以使用递归找到较小问题的解决方案。
这里是实现这些想法的EcmaScript 3解决方案:
function match(str, arr) {
var words = str.toLowerCase().split(/\s+/);
var keys = {};
for (var i = 0; i < arr.length; i++) keys[arr[i].toLowerCase()] = 1;
function recur(i) {
if (i >= words.length) return true;
var word = words[i];
if (keys[word]) { // Try full match first - relatively fast operation
keys[word] = 0;
if (recur(i+1)) return true;
keys[word] = 1; // backtrack: restore key
} else { // Try partial match - relatively slow operation
for (var key in keys) {
if (!keys[key] || word.slice(0, key.length) !== key) continue;
keys[word] = 0;
words[i] = word.slice(key.length);
if (recur(i)) return true;
words[i] = word; // backtrack: restore word
keys[word] = 1; // backtrack: restore key
}
}
return false;
}
return recur(0);
}
var str = "application Name";
var arr = ['nam', 'me', 'applica', 'app', 'lication', 'na'];
console.log(match(str, arr));
答案 1 :(得分:0)
因此,如果将完整的字符串及其部分用空格分开,则非常容易:
var stringExample = "application Name";
var example2 = "app King";
var example3 = "application";
var example4 = "some random string";
var arrayExample = ['app', 'application', 'name'];
function findMatch(string, array){
var a1 = string.toLowerCase().split(" ");
var match = false;
// create array simply to check for each string part if it is in the array
var matches = [];
for(var j = 0; j < a1.length; j++){
matches.push(false);
}
for(var i = 0; i < array.length; i++){
// Checking for complete Match
if(string.toLowerCase() === array[i].toLowerCase()){
match = true;
break;
}
// Checking for partly matches
for(var j = 0; j < a1.length; j++){
if(a1[j] === array[i].toLowerCase()){
matches[j] = true;
}
}
}
// if all parts of the string have a match, return true
if(matches.every(function(b){return b === true;})){
match = true;
}
return match;
}
console.log(stringExample + " does match: " + findMatch(stringExample, arrayExample));
console.log(example2 + " does match: " + findMatch(example2, arrayExample));
console.log(example3 + " does match: " + findMatch(example3, arrayExample));
console.log(example4 + " does match: " + findMatch(example4, arrayExample));