我想实现一种jQuery实时搜索。但是,发送输入到服务器之前,我想删除我的阵列,它有3点或更少的字符的所有项目(因为在德国的语言,这些话通常可以在搜索方面被忽略),所以["this","is", "a", "test"]成为["this", "test"]
["this","is", "a", "test"]
["this", "test"]
$(document).ready(function() { var timer, searchInput; $('#searchFAQ').keyup(function() { clearTimeout(timer); timer = setTimeout(function() { searchInput = $('#searchFAQ').val().match(/\w+/g); if(searchInput) { for (var elem in searchInput) { if (searchInput[elem].length < 4) { //remove those entries searchInput.splice(elem, 1); } } $('#output').text(searchInput); //ajax call here } }, 500); }); });
现在我的问题是,并非所有项目都在我的for循环中被删除。例如,如果我删除打字“这是一个测试”“是”,则“ a”保持不变。
我认为问题是for循环,因为如果我删除带有拼接的项目,则数组的索引会更改,因此它会继续使用“错误”的索引。
也许有人可以帮助我吗?
您可以向后循环,如下所示:
var searchInput, i; searchInput = ["this", "is", "a", "test"]; i = searchInput.length; while (i--) { if (searchInput[i].length < 4) { searchInput.splice(i, 1); } }
这是因为在数组上进行增量迭代,当您对其进行拼接时,数组将被修改到位,因此项目被“移位”,最终您将跳过某些迭代。向后循环(使用a while或什至for循环)可解决此问题,因为您未按拼接的方向循环。
while
for
同时,生成新数组而不是就地修改数组通常更快。这是一个例子:
var searchInput, newSearchInput, i, j, cur; searchInput = ["this", "is", "a", "test"]; newSearchInput = []; for (i = 0, j = searchInput.length; i < j; i++) { cur = searchInput[i]; if (cur.length > 3) { newSearchInput.push(cur); } }
其中newSearchInput将仅包含有效长度的项目,而您仍具有中的原始项目searchInput。
newSearchInput
searchInput
除了上述第二种解决方案,还可以使用类似的更新Array.prototype方法更好地处理该问题:filter。这是一个例子:
Array.prototype
filter
var searchInput, newSearchInput; searchInput = ["this", "is", "a", "test"]; newSearchInput = searchInput.filter(function (value, index, array) { return (value.length > 3); });