为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

繁华开满天机 2019-11-14 10:55:14

我想实现一种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循环,因为如果我删除带有拼接的项,则数组的索引会更改,因此它会继续使用“错误的”索引。


也许有人可以帮助我吗?


查看完整描述

3 回答

?
哔哔one

解决方案1

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


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/


这是因为在数组上进行增量迭代,在进行拼接时,数组将被修改到位,因此项目被“移位”,最终跳过了某些迭代。向后循环(使用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。


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


解决方案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/filter

Array.prototype.filter浏览器支持-http://kangax.github.io/es5-compat-table/#Array.prototype.filter


查看完整回答
反对 回复 2019-11-14
?
慕村225694

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

}


查看完整回答
反对 回复 2019-11-14
?
慕娘9325324

如果您安装了lodash库,则可能要考虑它们。


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


这是一个例子。


var searchInput = ["this", "is", "a", "test"];


_.forEachRight(searchInput, function(value, key) {


    if (value.length < 4) {

        searchInput.splice(key, 1);

    }

});


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信