2015-09-22 104 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));