使用拼接在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/
参考文献:
-
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
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); });
如果你已经安装了lodash图书馆,他们可能会考虑一个甜蜜的gem。
函数是_.forEachRight (从右到左迭代一个集合的元素)
这是一个例子。
var searchInput = ["this", "is", "a", "test"]; _.forEachRight(searchInput, function(value, key) { if (value.length < 4) { searchInput.splice(key, 1); } });