2016-03-03 46 views
2

我有兩個json數組。 EXP:推動元素正在改變json數據中的以前的元素

$scope.arr1 = [ 
      { "id": 1, "first_name": "Philip", "last_name": "Kim", "email": "[email protected]", "country": "Indonesia", "ip_address": "29.107.35.8" }, 
      { "id": 2, "first_name": "Judith", "last_name": "Austin", "email": "[email protected]", "country": "China", "ip_address": "173.65.94.30" }, 
      { "id": 3, "first_name": "Julie", "last_name": "Wells", "email": "[email protected]", "country": "Finland", "ip_address": "9.100.80.145" }, 
      { "id": 4, "first_name": "Gloria", "last_name": "Greene", "email": "[email protected]", "country": "Indonesia", "ip_address": "69.115.85.157" }, 
      { "id": 5, "first_name": "Andrea", "last_name": "Greene", "email": "[email protected]", "country": "Russia", "ip_address": "128.72.13.52" }] 

$scope.arr2=[]; 

和欲推ARR1的元素根據一些條件由字段ARR2字段。

var object; 
var temp = {}; 

    for (var i in $scope.arr1) { 
    object = $scope.arr1[i]; 
     for (var property in object) { 

      temp2 = object.id + '_' + property; 
      if ($scope.someOtherData.indexOf("unhighlighted") != -1) { 
       temp[property] = ""; 

       } 
      else { 

       temp[property] = object[property]; 

      } 
      } 
     $scope.arr2.push(temp); 
     } 

我的第一個問題: 先將溫度推到arr2好。但是,當我推第二或更多arr2中的所有元素都變成最後的臨時值。我可以修復這個問題嗎?

我的第二個問題是:我沒有將$$ hashKey屬性添加到arr1。但它是自發發生的。 我該如何預防?

+0

$$ hashKey是私有角度變量。 –

回答

0

的問題是因爲在JavaScript中objects are passed around by reference。因此,解釋你的代碼temp被全局聲明爲循環,因此創建了一個對象並在循環中分配了一些值並將temp推入數組,所有工作都第一次正常工作,現在將temp更新爲第二個新值循環,在這裏你正在更新same object和你推入數組的對象也是同一個對象,你只是在循環中處理它的引用直到結束,所以這就是你在數組中獲得相同值的原因並且值是最後一個循環。您基本上已經將相同的對象多次推入數組中,並且更新一個會影響所有對象,因爲它們都指向同一個對象。

因此,這裏的修復,

1),因爲人們已經提出,在每個循環創建一個新的對象。這樣在每個循環中創建一個新對象,並且沒有參考問題。該代碼將是

for (var i in $scope.arr1) { 
    object = $scope.arr1[i]; 
    var temp = {}; // creating new object in every loop 
    for (var property in object) { 
     //your stuff 

2)你把對象放入數組就在做它的一個克隆,然後推動,這樣你推新對象的所有的時間。代碼如下所示。

var newObject = Object.clone(temp); // create a new object by cloning 
    $scope.arr2.push(newObject); 
0

您需要爲每次迭代創建一個新對象,那麼您將不會通過引用更新同一個對象。

現在你將幾個相同的對象添加到array2中,並且它真的是一樣的,所以最後你將在數組2中有相同對象的幾個副本。

//this help you to prevent usage of the same object 
var temp = {}; 
for (var property in object) { 
    //please add here to not copy something that you don't 
    if(object.hasOwnProperty(property)) 
    {   
     ... 
    } 
+0

var需要在for循環之前聲明。 – jcubic

0

您需要申報的無功溫度for循環:

for (var i in $scope.arr1) { 
    object = $scope.arr1[i]; 
    var temp = {}; //<--------here 
    for (var property in object) {