解决方案 3除了上面的第二个解决方案,还有一个类似的、更新的 Array.prototype 方法可以更好地处理这个问题:filter.举个例子:var searchInput, newSearchInput;searchInput = ["this", "is", "a", "test"];newSearchInput = searchInput.filter(function (value, index, array) {return (value.length > 3);});演示: http://jsfiddle.net/qky7D/>参考:Array.prototype.filter - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filterArray.prototype.filter 浏览器支持 - http://kangax.github.io/es5-compat-table/#Array.prototype.filterI want to implement a kind of jQuery live search.But before sending the input to the server I'd like to remove all items in my array which have 3 or less characters (because in the german language, those words usually can be ignored in terms of searching)So ["this", "is", "a", "test"] becomes ["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);});});Now my problem is that not all items get removed in my for loop. If I for example typ "this is a test" "is" gets removed, "a" stays.JSFIDDLEI think the problem is the for loop because the indexes of the array change if I remove an item with splice, so it goes on with the "wrong" index.Perhaps anybody could help me out? 解决方案 Solution 1You can loop backwards, with something like the following: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/This is because iterating incrementally through the array, when you splice it, the array is modified in place, so the items are "shifted" and you end up skipping the iteration of some. Looping backwards (with a while or even a for loop) fixes this because you're not looping in the direction you're splicing.Solution 2At the same time, it's usually faster to generate a new array instead of modifying one in place. Here's an example: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); }}where newSearchInput will only contain valid length items, and you still have the original items in searchInput.DEMO: http://jsfiddle.net/RYAx2/Solution 3In addition to the second solution above, a similar, newer Array.prototype method is available to handle that better: filter. Here's an example:var searchInput, newSearchInput;searchInput = ["this", "is", "a", "test"];newSearchInput = searchInput.filter(function (value, index, array) { return (value.length > 3);});DEMO: http://jsfiddle.net/qky7D/References:Array.prototype.filter - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filterArray.prototype.filter browser support - http://kangax.github.io/es5-compat-table/#Array.prototype.filter 这篇关于使用 for 循环中的拼接从数组中删除项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
10-15 06:14