我想实现一种jQuery实时搜索。
但是在将输入发送到服务器之前,我想删除数组中包含3个或更少字符的所有项目(因为在德语中,这些单词在搜索方面通常可以忽略)
因此["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”停留。 JSFIDDLE
我认为问题是for循环,因为如果我用splice删除一个项目,数组的索引就会改变,所以它继续使用“错误的”索引。
也许有人可以帮帮我吗?
答案 0 :(得分:126)
您可以使用以下内容向后循环:
var searchInput, i;
searchInput = ["this", "is", "a", "test"];
i = searchInput.length;
while (i--) {
if (searchInput[i].length < 4) {
searchInput.splice(i, 1);
}
}
DEMO: http://jsfiddle.net/KXMeR/
这是因为通过数组递增迭代,当你拼接它时,数组就会被修改,所以这些项被“移位”,你最终会跳过一些迭代。向后循环(使用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
中的原始项目。
DEMO: http://jsfiddle.net/RYAx2/
除了上面的第二个解决方案之外,还有一个类似的,更新的Array.prototype
方法可以更好地处理这个问题:filter
。这是一个例子:
var searchInput, newSearchInput;
searchInput = ["this", "is", "a", "test"];
newSearchInput = searchInput.filter(function (value, index, array) {
return (value.length > 3);
});
DEMO: http://jsfiddle.net/qky7D/
<强>参考文献:强>
Array.prototype.filter
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter Array.prototype.filter
浏览器支持 - http://kangax.github.io/es5-compat-table/#Array.prototype.filter 答案 1 :(得分:5)
var myArr = [0,1,2,3,4,5,6];
问题陈述:
myArr.splice(2,1);
\\ [0, 1, 3, 4, 5, 6];
现在在第二个位置移动3个,长度减少1,这会产生问题。
解决方案:拼接时,一个简单的解决方案是反向迭代。
var i = myArr.length;
while (i--) {
// do your stuff
}
答案 2 :(得分:2)
如果你安装了 lodash 库,那么你可能需要考虑它们。
该函数是 _。forEachRight (从右到左迭代集合的元素)
这是一个例子。
var searchInput = ["this", "is", "a", "test"];
_.forEachRight(searchInput, function(value, key) {
if (value.length < 4) {
searchInput.splice(key, 1);
}
});
答案 3 :(得分:1)
您还可以使用$.grep函数过滤数组:
var timer, searchInput;
$('#searchFAQ').keyup(function () {
clearTimeout(timer);
timer = setTimeout(function () {
searchInput = $('#searchFAQ').val().split(/\s+/g); // match is okay too
searchInput = $.grep(searchInput, function(el) {
return el.length >= 4;
});
console.log(searchInput);
}, 500);
});
答案 4 :(得分:0)
另一种方法是,每当您从数组(x--)进行切片时,都会减小索引,以便当数组下移时,下一个元素不会被跳过。
var searchInput;
searchInput = ["this", "is", "a", "test"];
for (var x = 0; x < searchInput.length; x++) {
if (searchInput[x].length < 4) {
searchInput.splice(x--, 1);
}
}
console.log(searchInput);