0

所以我有一个包含很多重复值的数组。myArr = ['yeh','yeh','yeh','hey']. 我有一个 HTML 表单,允许用户输入一个单词,如果该单词在数组中,它将删除所有重复值并打印出没有这些值的新 myArr。但是,我的循环在几个循环后继续停止,而没有完成删除其余重复项。就像我['yeh','yeh','yeh']在表格中输入“yeh”一样,它只会删除两个“yeh”。

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);
            console.log(myArr);
        }
    });
    console.log(myArr);
    $('#user_list').html('');
    for (var i=0; i < myArr.length; i += 1) {
        console.log(myArr[i]);
        $('#user_list').append('<li>' +myArr[i]+ '</li>');
    };
    return false;
});

更新的答案(如下所述,我在对其进行循环时对其进行了修改,所以事情被跳过了。我使用 grep 创建了一个新数组,其中包含与提交的值不匹配的所有值,然后只是一个一个地检查 diffValues 元素并打印出来):

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

2 回答 2

1

当您splice使用数组时,您正在更改该数组。所以基本上你的阵列正在经历这些步骤:

['yeh','yeh','yeh','hey']
  ^^^
splice, move iterator forward
['yeh','yeh','hey']
        ^^^
splice, move iterator forward
['yeh','hey']
              ^^^
end loop - one of the 'yeh' is still there

您可能对.grep().

于 2012-08-20T04:25:39.217 回答
0

如果要删除正在循环使用的数组中的值,则必须向后遍历它(因为以这种方式使数组的长度更短不会使循环无效)。

id = $('#user_num').val();
for (var i = myArr.length - 1; i >= 0; i--) {
    if (myArr[i] == id) {
        myArr.splice(i, 1);
    }
}
于 2012-08-20T04:29:39.683 回答