使用拼接在for循环中删除arrays中的项目

我想实现一种jQuery实时search。 但在发送input到服务器之前,我想删除我的数组中有3个或更less字符的所有项目(因为在德语中,这些字通常可以忽略search)所以["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循环被删除。 如果我例如typ“这是一个testing”“是”被删除,“一个”保持。 的jsfiddle

我认为问题是for循环,因为如果我用splice删除一个项目,数组的索引会改变,所以它会继续“错误”的索引。

也许有人可以帮我吗?

解决scheme1

你可以向后循环,如下所示:

 var searchInput, i; searchInput = ["this", "is", "a", "test"]; i = searchInput.length; while (i--) { if (searchInput[i].length < 4) { searchInput.splice(i, 1); } } 

演示: http : //jsfiddle.net/KXMeR/

这是因为通过数组递增地迭代,当拼接时,数组被修改,所以项目被“移位”,最终跳过一些迭代。 向后循环(有一段while ,甚至一个for循环)修复这个问题,因为你没有沿着你拼接的方向循环。


解决scheme2

同时,生成一个新的数组通常会更快,而不是修改一个。 这是一个例子:

 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/


解决scheme3

除了上面的第二个解决scheme之外,还有一个类似的,更新的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/


参考文献:

 var myArr = [0,1,2,3,4,5,6]; 

问题陈述:

 myArr.splice(2,1); \\ [0, 1, 3, 4, 5, 6]; 

现在在第二个位置3步移动,长度减1,这就造成了问题。

解决scheme:一个简单的解决scheme将在拼接时反向迭代。

 var i = myArr.length; while (i--) { // do your stuff } 

您也可以使用$ .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); }); 

http://jsfiddle.net/dfsq/4Wdp9/

如果你已经安装了lodash图书馆,他们可能会考虑一个甜蜜的gem。

函数是_.forEachRight (从右到左迭代一个集合的元素)

这是一个例子。

 var searchInput = ["this", "is", "a", "test"]; _.forEachRight(searchInput, function(value, key) { if (value.length < 4) { searchInput.splice(key, 1); } });