0

だから私は多くの繰り返し値を持つ配列を持っています。myArr = ['yeh','yeh','yeh','hey']. ユーザーが単語を入力できるHTMLフォームがあり、その単語が配列にある場合、すべての繰り返し値が削除され、それらの値なしで新しいmyArrが出力されます。ただし、残りの重複を削除せずに、数回ループした後、ループが停止し続けます。フォームに「yeh」と入力した場合と同様に['yeh','yeh','yeh']、2 つの「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 要素を 1 つずつ調べて、それぞれを出力します):

$('#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

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 に答える