1

所以我有一个Array充满一堆重复的东西['hey','hey','yeh'],如果提交的文本与它匹配,我有一个 html 表单,它会从我的数组中删除任何条目。但是,我的 JS/jQuery 似乎并没有按照我喜欢的方式运行。每次我按下按钮时,似乎只有前几个条目被删除,而不是所有匹配项(这是我想要的)。我的“每个”函数不应该遍历数组中的所有项目并删除与提交的内容匹配的所有条目吗?

HTML:

<form id="remove_user" action="#" method="post">
        <label for="user_num">Remove user:</label>
        <input type="text" id="user_num" name="user_num" placeholder="number">
        <input type="submit" value="(-) remove">
    </form><!-- #remove_user -->

    <ul id="user_list"></ul><!-- #user_list -->

JS 更新了一个更改,但仍然无法正常工作:

$('#remove_user').submit(function(){
    id = $('#user_num').val();
    $.each(myArr, function(i, value){
        if (value == id){
            myArr.splice(i, 1);
        };
    });
    $('#user_list').html('');
    for (var i=0; i < myArr.length; i += 1) {
        $('#user_list').append('<li>' +myArr[i]+ '</li>');
    };
    return false;
});
4

3 回答 3

2

嘿,我认为这应该是这样的。

$.each(myArr, function(i, value){
    if (value == id){
        // delete myArr[myArr.indexOf(value)];
        myArr.splice(i, 1); //i is current index

};

编辑

$('#remove_user').submit(function() {
id = $('#user_num').val();
$.each(myArr, function(i, value) {
    if (value == id) {
        myArr.splice(i, 1, '');
    };
});

小提琴

于 2012-08-19T22:20:47.267 回答
0

替换这部分:

$.each(myArr, function(i, value){
        if (value == id){
            // delete myArr[myArr.indexOf(value)];
            myArr.splice(myArr.indexOf(value), 1);
};

这个使用$.grep

myArr = $.grep(myArr, function(value) {
  return value != id;
});

还有一种更漂亮的方法可以使用.spliceand $.inArray

var myArr = ['le', 'le', 'la']
var removeItem = 'la';

myArr.splice($.inArray(removeItem, myArr), 1);

// Will print only 'le', 'le'
alert(myArr);

这是一个 jsFiddle 供您尝试:http: //jsfiddle.net/leniel/4zENw/2/

于 2012-08-19T22:14:28.423 回答
0

jQuery 的 .each 函数使用从 0 开始的整数对数组进行迭代,以对它们进行索引。当您在发生这种情况时从数组中取出某些内容时,jQuery 的 index var 不会被告知它,您最终会跳过一个项目。

如果从数组的另一端迭代,这不是问题;

var i = myArr.length;
while (i--) {
    if (myArr[i] === value) {
        myArr.splice(i, 1);
    }
}
于 2012-08-19T22:21:32.697 回答