2010-09-22 35 views
1

這應該是一個快速的過程,但我爲了這個JavaScript爲什麼不適用於我而頭腦發熱。目標是採取一個輸入框(由空格分隔單詞的字符串)的值,在陣列中列出這些字作爲項,並刪除那些少於3個字符:JavaScript按字符計數過濾<input>值的數組

var typed = $('input').val(); 
var query = typed.split(" "); 
var i=0; 
for (i=0; i<query.length; i++) { 
    if (query[i].length < 3) { 
    query.splice(i,1); 
    } 
} 

有這個運行onkeyup對於輸入框來說,它似乎工作,但只有大約50%的時間(1或2個字符的字符串偶爾會進入陣列)。任何建議將非常感激。

回答

3

問題是,您正在迭代,同時刪除元素。考慮這個數組:

["he", "l", "lo world"] 

最初的循環開始於指數0,並從陣列中刪除"he"。現在,新的陣列是

["l", "lo world"] 

在下一次迭代i1,你會檢查"lo world"的長度,從而完全忽略了"l"字符串。

在Array中使用filter方法刪除不需要的元素。

var biggerWords = query.filter(function(word) { 
    return word.length >= 3; 
}); 
+0

是的,這個工程。或者從下面的幾個答案中看到構建一個新的數組也是可行的。感謝大家的快速回復... zounds。 – Jope 2010-09-22 04:44:18

+0

要注意它的兼容性;)[filter](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter) – Reigel 2010-09-22 04:49:39

1

除了迭代問題,你也可能會看到意外的條目如果您鍵入多個空格

嘗試

var query = typed.split(/\s+/); 

這樣,它會分裂的任何數量的空格,而不是每一個單獨

1

問題是,你正在切片數組,同時向前計數。仔細想想......如果你從數組中取出一個索引點,並將其縮短一個,那麼遞增i並移動到下一個索引點實際上比你想要的更遠,完全缺少下一個索引。遞增i--,從query.length-1開始,並使條件爲i>=0。對於此類情況的一個例子,看看這裏:

http://jsfiddle.net/kcwjs/

CSS

input { 
    width:300px; 
}​ 

HTML

<input id="textbox" type="text" /> 
<div id="message"></div>​ 

的Javascript

$(document).ready(function() { 
    $('#textbox').keyup(checkStrings); 
}); 

function checkStrings(e) { 
    var typed = $('#textbox').val(); 

    if (typed == "") return false; 

    var query = typed.split(" "); 
    var querylen = query.length; 
    var acceptedWords = ''; 
    var badWords = ''; 

    for (var i = querylen-1; i >= 0; i--) { 
     if (query[i].length < 3) { 
      badWords += query[i] + " ";    
     } else { 
      acceptedWords += query.splice(i,1) + " "; 
     } 
    } 

    $('#message').html("<div>Bad words are: " + badWords + "</div>" + 
         "<div>Good words are: " + acceptedWords + "</div>"); 
} 
0

嘿我想你應該使用一個新的數組結果。因爲你正在刪除數組中的元素。長度被改變。這裏是我的解決方案

var typed = "dacda cdac cd k foorar"; 
var query = typed.split(" "); 
var i=0; 
var result = []; 
for (i=0; i<query.length; i++) {  
    if (query[i].length >= 3) { 
    result.push(query[i]); 
    } 
} 
1

試試這個代碼,它獲得的擺脫任何3分字符的話,以及確保沒有創建空數組元素。

typed.replace(/(\b)\w{1,3}\b/g,"$1"); 
var query = typed.split(/\s+/);