我想从数组中删除元素,同时记住它们的位置并稍后添加它们。到目前为止,我有这段代码:删除数组元素,并将它们添加回它们所在的位置
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
的初始状态,它可以造成问题。
例如,如果您删除'B'
和'D'
并添加'D'
和'B'
,你最终['A', 'B', 'C', 'E', 'D']
,而不是['A', 'B', 'C', 'D', 'E']
。
Here is a jsfiddle showing what the problem is
我应该改变什么修改为my_array
结束了在它的初始状态,无论诸多元素我删除或添加,以及如何?
我想过在删除时存储有关围绕已删除元素的哪些元素的信息,并在添加回来时将其用作额外信息,但是想知道是否有更好的方法。
我不知道这是很有可能的。我不知道你是如何使用这段代码,而是想想事件的顺序。如果某些字母被删除并放回到其他字母之前,那么关于每个删除的字母存储什么“原始”信息都无关紧要 - 不能保证阵列的当前状态与原始状态相同。如果你的要求是某些字母被一次删除,然后你立刻把它们全部放回去,那应该不会坏。如果没有特定的事情发生顺序,这应该是艰难的。 – Ian 2012-07-25 14:17:17