2012-07-25 92 views
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的初始状态,它可以造成问题。

例如,如果您删除'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结束了在它的初始状态,无论诸多元素我删除或添加,以及如何?

我想过在删除时存储有关围绕已删除元素的哪些元素的信息,并在添加回来时将其用作额外信息,但是想知道是否有更好的方法。

+0

我不知道这是很有可能的。我不知道你是如何使用这段代码,而是想想事件的顺序。如果某些字母被删除并放回到其他字母之前,那么关于每个删除的字母存储什么“原始”信息都无关紧要 - 不能保证阵列的当前状态与原始状态相同。如果你的要求是某些字母被一次删除,然后你立刻把它们全部放回去,那应该不会坏。如果没有特定的事情发生顺序,这应该是艰难的。 – Ian 2012-07-25 14:17:17

回答

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; 
    }); 
} 
+0

这就是要走的路:)为那些想测试的人提供'jsFiddle':http://jsfiddle.net/enSqv/ – Max 2012-07-25 14:27:00

相关问题