2014-05-15 83 views
2

如何從陣列的副本中刪除對象而不從原始陣列中刪除對象?從陣列的副本中刪除項目而不將其從陣列中刪除

我有一個全局變量:

var userTrickList = []; 

和一個函數裏面,我作出這樣的全局數組的一個副本:

var tempUserTrickList = userTrickList; 

然後我用我創建到刪除的removeItem功能某個對象。

removeItem(considerTrick.IDName, tempUserTrickList); 


    function removeItem(item, list) { 
     //takes a string as 'item', finds in the array as 'list', 
     //then removes it from the list. 
     for(var i = 0; i < list.length; i++) 
     { 
      if(item === list[i]) 
      { 
       list.splice(i,1); 
      } 
     } 
    } 

我的問題是,這個功能從userTrickList太刪除。

任何想法?這絕對是"removeItem(considerTrick.IDName, tempUserTrickList);"中的一個問題,但我想不出一個解決方案。

回答

12

使用.slice(0)克隆數組。

var tempUserTrickList = userTrickList.slice(0); 

現金 http://davidwalsh.name/javascript-clone-array

+0

我確實檢查過了,這不起作用您必須使用slice而不是splice.bcoz splice會影響源數組。 http://fiddle.jshell.net/QRK4Q/ – Balachandran

+0

謝謝丹尼爾2號!和Manishankar! (編號1 ...) 像魅力一樣工作:')這個社區生病了! –

+0

@Manishankar你絕對正確。我鏈接到正確使用'slice'的示例,並且在複製時錯誤地添加了'p'。謝謝你的收穫。 – Daniel

2

使用此功能爲您的要求

function removeElementFromArray(data,target) { 
var temp=new Array(); 
for (var i = 0; i < data.length; i++) { 
    if(data[i]!=target){ 
     temp.push(data[i]); 
    } 
} 
return temp; } 

這裏的數據是原始數組和目標是要從陣列 這個函數會返回數組刪除元素不包含已刪除的項目。

0
for (i = 0, l = arr.length; i < l; i++) { 
    if (arr[i] === item) { 
    arr.splice(i, 1); 
    i -= 1; 
    l -= 1; 
    } 
} 
+0

儘管此代碼可能會回答這個問題,但提供關於此代碼爲何和/或如何回答此問題的其他上下文可提高其長期價值。 – Christian

0

丹尼爾的克隆陣列的方法是絕對正確的,但因爲我沒有看到一個面向ES6回答,我會提供了一個可選的解決方案:

,我們可以很容易地使用傳播運算符來克隆一個數組,所以我們不必使用slice調用。

const arr = [1, 2, 3]; 
const copy = [...arr]; 
copy.pop(); 
console.log(arr); // returns [1, 2, 3] 
console.log(copy); // returns [1, 2]