2

位置を記憶しながら配列から要素を削除し、後で追加しようとしています。これまでのところ、次のコードがあります。

var my_array = ['A', 'B', 'C', 'D', 'E'];
var removed_elements = [];

// Assuming letter provided exists in my_array
function remove_element(letter) {
    for (var index in my_array) {
        if (my_array[index] == letter) {
            break;
        }            
    }
    var removed_element = {
        index: index,
        letter: letter            
    }
    removed_elements.push(removed_element);
    my_array.splice(index,1);
}

// Assuming letter provided exists in removed_elements
function add_element(letter) {
    for (var index in removed_elements) {
        console.log('test');
        if (removed_elements[index].letter == letter) {
            console.log(removed_elements[index]);
            break;
        }            
    }
    my_array.splice(removed_elements[index].index,0,removed_elements[index].letter);
}

一度に 1 つの要素を削除し、別の要素を削除する前に追加し直せば問題なく動作します。ただし、複数の要素を連続して削除し始めると、削除された要素 (最初の要素ではなく、後続の要素) に対して保存されたインデックスは、削除my_array時の状態に対して相対的になり、絶対的ではなくmy_arrayの初期状態になるため、問題が発生する可能性があります。 .

たとえば、 and を削除'B'して and'D'を追加する'D''B'['A', 'B', 'C', 'E', 'D']代わりに['A', 'B', 'C', 'D', 'E'].

これは、問題が何であるかを示すjsfiddleです

my_array多くの要素を削除または追加しても、どの変更をどのように変更して初期状態にする必要がありますか?

削除時に削除された要素を囲む要素に関する情報を保存し、それを追加するときに追加情報として使用することを考えましたが、より良い方法があるかどうか疑問に思います。

4

1 に答える 1

1

私は実際にはそれらをまったく削除しません:

var my_array = ['A', 'B', 'C', 'D', 'E'];
var removed = [];

function remove_element(letter) {
    var i = my_array.indexOf(letter);

    if(i > -1) {
        removed.push(i);
    }
}

function add_element(letter) {
    var i = my_array.indexOf(letter);

    if(i > -1) {
        removed.splice(removed.indexOf(i), 1);
    }
}

function get_array() {
    return my_array.filter(function(x, i) {
        return removed.indexOf(i) === -1;
    });
}
于 2012-07-25T14:07:15.897 に答える