2013-03-21 51 views
1

我试图教自己的JavaScript。我选择了一些我认为很简单但却相对迅速地遇到问题的东西。Javascript:匹配数组的动态字符串

我正在尝试搜索用户给出的另一个字符串的字符串。

到目前为止我的代码是:

var source = "XREs2qqAQfjr6NZs6H5wkZdOES5mikexRkOPsj6grQiYNZfFoqXI4Nnc1iONKVrA"; 
var searchString = []; //the users input 
searchString = prompt("Enter search string"); 
var hits = []; 
var one = 0; 
var two = 0; 
var k = 0; 

var sourceSearch = function(text) { 
    for(i = 0; i < source.length; i++) { //for each character in the source 
     if(source[i] === searchString[0]) { //if a character in source matches the first element in the users input 
      one = source.indexOf(i); //confused from here on 
      for(p = searchString.length; p > 0; p--) { 

      }      
     } 
    } 
}; 


sourceSearch(searchString); 

我的想法是:看

  • 检查,如果第一循环认定的第一个字符在用户输入相匹配的字符
  • 如果它匹配,检查在第一次匹配源字符串中的下一个X字符后的下一个X字符是否全部匹配,将它们推送到匹配数组
  • 如果它们全都匹配,则将它们推送到匹配数组

我的问题:我不知道如何沿着阵列无迭代嵌套if语句也不少,即使在当时,这是不够的,考虑到我想要的程序与任何输入工作。

任何想法都会有所帮助。首先十分感谢。

注:我正在测试的想法中有一些未使用的变量,但我无法让它们工作。

回答

0

至于其他的答案至今指出,JavaScript的字符串有一个indexOf功能这就是你想要的。如果你想看看它是如何做“手”,你可以修改你的函数是这样的:

var sourceSearch = function(text) { 
    var i, j, ok; // always declare your local variables. globals are evil! 
    // for each start position 
    for(i = 0; i < source.length; i++) { 
     ok = true; 
     // check for a match 
     for (j = searchString.length - 1; ok && j >= 0; --j) { 
      ok = source[i + j] === searchString[j]; 
     } 
     if (ok) { 
      // searchString found starting at index i in source 
     } 
    } 
}; 

此功能会发现在这searchString被发现在source所有位置。 (当然,你可以在第一次成功时跳出循环。)逻辑是使用外部循环前进到source中的每个候选开始位置,并使用内部循环来测试该位置实际上是否为匹配searchString

这不是搜索字符串的最佳算法。内置算法要快得多(因为它是一个更好的算法,因为它是本地代码)。

+0

非常感谢。不幸的是,凭借我有限的经验,我无法理解这一点。 – Malaugrym 2013-03-21 18:12:31

+0

我超过了5分钟的编辑时间,剩下的就是这里。 '(j = searchString.length - 1; ok && j> = 0; --j)** **第一个**:在这一点上,ok是真的。如果我正确读取它,那么此循环运行,直到ok为假,且j小于或等于0。我看不出有多好可能会变成错误的,除非它没有,在这种情况下我彻底失去了。 **第二**:'ok = source [i + j] = searchString [j];'。我根本就不明白这一点。我读它为“真正成为(我加入到j)成为searchString中的第j个位置”。我没有理解什么?再次感谢您的耐心。 – Malaugrym 2013-03-21 18:21:25

+0

@Malaugrym - 循环运行,直到'ok'为'false'或'j <0'。好的问题可能会成为错误。这是一个错字,该行应该是'ok = source [i + j] === searchString [j];'。现在已经解决了答案。对于那个很抱歉。 – 2013-03-21 18:46:18

1

你可以试试:

if (source.indexOf(searchString) !== -1) { 
// Match! 
} 
else 
{ 
//No Match! 
} 
0

按照你的方法,你可以只用2个索引玩:

var sourceSearch = function(text) { 
    j = 0; 
    for(i = 0; i < source.length; i++) { 
     if(source[i] === text[j]) { 
      j++;     
     } else { 
      j = 0; 
     } 
     if (j == text.length) { 
      console.log(i - j); //this prints the starting index of the matching substring 
     } 
    } 
}; 
0

这些答案都是相当不错的,但我可能会选择这样的事情:

var source = "XREs2qqAQfjr6NZs6H5wkZdOES5mikexRkOPsj6grQiYNZfFoqXI4Nnc1iONKVrA"; 
var searchString = []; //the users input 
searchString = prompt("Enter search string"); 
var hits = source.split(searchString); 
var hitsCount = hits.length - 1; 

这种方式,你有你需要弄清楚每一击发生在他那里源数据,如果这对你很重要。