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 のインデックス var はそれについて知らされず、アイテムをスキップしてしまいます。

配列の反対側から繰り返す場合、これは問題ではありません。

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