2017-06-16 31 views
0

我使用兩個不同的陣列對象initialPermissionArr[item.id]newPermissionArr[roleId]在兩個不同的函數一個對象的密鑰值上的其他類似類型的對象的更新改變的JavaScript

function(item){ 


    vm.initialPermissionArr[item.id] = item.permissions.map(function (permission) { 
     permission.status = true; 
     return permission; 
    }); 
} 


     staticArr[item.id] = item.permissions.map(function (permission) { 
      permission.status = true; 
      return permission; 
     }); 

     newpermissionArr[item.id] = vm.initialPermissionArr[item.id]; 

下面函數更新陣列中,如果相同的對象發現更新狀態,並在新的對象被發現其推向newPermissionArr

function onChanageOfPermission(roleId,item) { 
    var flag = false ; 
    for (var key in newpermissionArr[roleId]){ 
     if(newPermissionArr[roleId][key].id == item.id){ 
     flag = true; 
     newPermissionArr[roleId][key].status = item.status; 
     break; 
     } 
    } 
    if (!flag) { 
     newPermissionArr[roleId].push(item); 
    } 
} 

所以當newPermissionArr[roleId][key].status = item.status;更新也更新在initialPermissionArr[item.id]也狀態。 和初始聲明是

var newPermissionArr = []; 
var staticArr = []; 

其中用於例如產品

{ 
    roleId : 1, 
    permissions : [{"name": "A", "id" : 1},{ "name" : "B", "id" : 2 }] 
} 

我需要初始對象陣列保持相同,並在端我需要初始陣列與所述修改後的數組比較和需要找到參考,然後更新它在兩個陣列中更新的狀態。如何避免這種情況?

+1

這兩個'數組'可能都有對同一個'對象'的引用? – Arg0n

+0

哪裏可以被引用是相同的,我不會在任何地方複製到彼此 – atjoshi

+1

很難說當你沒有包括如何/當你使用'onChangeOfPermission'時,以及你作爲'item'傳入的東西。 – Arg0n

回答

1

這發生,因爲以下的代碼行

newpermissionArr[item.id] = vm.initialPermissionArr[item.id];

這裏目的通過引用傳遞的,所以每當newpermission來更新intialpermission也將被更新。

要解決這個問題,只需將intialPermissionArr複製到newPermissionArr。 不幸的是,普通的javascript沒有像angular.copy這樣的函數。所以,你將不得不爲此在以下way-

newrPermissionArr[item.id] = JSON.parse(JSON.stringify(vm.intialPermissionArr[item.id]));

這應該解決您的問題。

2

數組引用相同的對象。若要修改只是其中之一,你應該使用slice()函數用於克隆數組:

newpermissionArr[item.id] = vm.initialPermissionArr[item.id].slice(); 
1

當您指定的東西a和b,它是內存中的一個指針對象C。然後,只要你將它改爲c2,a和b就會從那個點獲得c2,因爲它們只是指向相同位置的指針。

相關問題