2012-07-25 94 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

相關問題