小编典典

使用for循环中的拼接从数组中删除项目

javascript

我想实现一种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”保持不变。

我认为问题是for循环,因为如果我删除带有拼接的项目,则数组的索引会更改,因此它会继续使用“错误”的索引。

也许有人可以帮助我吗?


阅读 346

收藏
2020-05-01

共1个答案

小编典典

解决方案1

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

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循环)可解决此问题,因为您未按拼接的方向循环。


解决方案2

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

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


解决方案3

除了上述第二种解决方案,还可以使用类似的更新Array.prototype方法更好地处理该问题:filter。这是一个例子:

var searchInput, newSearchInput;

searchInput = ["this", "is", "a", "test"];
newSearchInput = searchInput.filter(function (value, index, array) {
    return (value.length > 3);
});
2020-05-01