2015-09-22 71 views
0

我在查找和显示数组中的字符串时遇到了一些问题。多年来没有做过任何类型的代码,所以我有点生疏。我的问题是这样的:与indexOf for循环中的数组匹配字符串,错误

说我有一个这样的数组:

var titles = ["0","Little Mouse", "1","Shaman Disciple", "2","Accomplished Shaman", "3","Shaman", "4","Little Pixie"]; 

(数字前的头衔是指用作标题的ID,我只是用标题[I-1]去取,这是非常重要的,他们在那种顺序!)

而且我想找到该数组中包含“小”,并显示其相应的数字的每个字符串。我想出了这个,但它不会工作,我已经尝试阅读关于循环和写东西的一堆,但我无法弄清楚。 我想出了这个脚本:

var x=document.getElementById("title").value; 
var xs=x.toLowerCase(); 

    for(var i = 0; i <= titles.length; i++){ 
     if(xs.indexOf(titles[i].toLowerCase()) != -1){ 
      document.getElementById("command").innerHTML = "/title " + titles[i-1]; 
     } else { 
      document.getElementById("command").innerHTML = "no title like that"; 
     } 
    } 

它的设置去的onkeyup =“dostuff()”在一个文本框(我知道不可能是健康的还是不错的代码,但不管),而且它如果你输入完整的字符串,它就不会显示数组中的所有匹配。我知道我应该使用innerHTML + blahblah而不是innerHTML = blahblah,但它只是无限期地增加了标题!我该怎么办
对不起,对文本的墙!

+1

你想要标题或编号作为你的结果吗?为什么你的阵列首先是这样呢? – PHPglue

回答

0

欢迎回到编程和StackOverflow。现在有很多可用的资源,特别是如果您使用JavaScript。

大多数浏览器现在都包含一个内置的调试器和其他有用的开发工具。

还有几个在线资源,您可以编写和测试代码,而无需担心托管。一个流行的是JSFiddle.net。

我发现代码中的几个问题:

  1. 您环路指数递增i变量太多次。
  2. 调用indexOf时,xstitles变量的顺序与他们所需要的相反。
  3. 您需要忽略空白xs,因为它总是匹配。
  4. 您需要以某种方式累积匹配项并在退出循环后输出它们。

所以修补后的代码如下所示:

var x=document.getElementById("title").value; 
var xs=x.toLowerCase(); 

var found = []; 
if (xs) { 
    // was "i <= titles.length" 
    for (var i = 0; i < titles.length; i++){ 
     // was "xs.indexOf(titles[i].toLowerCase())" 
     if (titles[i].toLowerCase().indexOf(xs) != -1){ 
      // need to add items to list here 
      found.push(titles[i - 1]); 
     } 
    } 
} 

// this logic needs to be outside of loop 
if (found.length > 0) { 
    document.getElementById("command").innerHTML = "/title " + found.join(); 
} else { 
    document.getElementById("command").innerHTML = "no title like that"; 
} 

这里,它是JSFiddle.net:http://jsfiddle.net/qa4x7b8t/4/

再次欢迎您的StackOverflow。请务必注册并接受有用的答案。

+0

Ooooh,非常感谢你!多么好的和详细的解释! :) 它与结果阵列整齐,我想我尝试过,但设法搞砸了。总而言之,我现在看起来很简单。 – Deda

+0

很高兴帮助。如果有帮助,请接受并提出答案。谢谢! –

0

您想在titles[i]的内部找到xs的索引,但是您要在xs内寻找标题。

它应该是titles[i].toLowerCase().indexOf(xs) != -1

0

看到这个捣鼓您的解决方案Link to fiddle For循环应该运行小于数组不等于和字符串的长度应的结束for循环替换

var titles = ["0","Little Mouse", "1","Shaman Disciple", "2","Accomplished Shaman", "3","Shaman", "4","Little Pixie"]; 
var x="Little"; //test string 
var serchStr=''; 
var xs=x.toLowerCase(); 
for(var i = 0; i <titles.length; i++){ 

    if(titles[i].toLowerCase().indexOf(xs) >-1){ 

     serchStr += "/title " + titles[i-1]; 
    } 
} 
if(serchStr=='') 
    serchStr = "no title like that"; 
alert(serchStr); 
0

在这里你去:

function findInRetardedArray(find, retardedArray){ 
    var r = [], f = new RegExp(find, 'i'); 
    for(var i=0,l=retardedArray.length; i<l; i+=2){ 
    if(retardedArray[i].match(f)){ 
     r.push(retardedArray[i]); 
    } 
    } 
    return r; 
} 
// run the below on an Event instead of in the console 
console.log(findInRetardedArray(document.getElementById('title').value, titles));