2016-01-29 50 views
2

我處於一個奇怪的狀態。我有一個對象數組,我使用angular.forEach來修改每個對象的價格鍵值,但是當我每次更改它時,它也會更改主數組對象。當改變複製變量的值時,它也會改變angularjs中的主變量值

看看代碼,你會明白我想說什麼。

var option_1_val = $scope.options.option_1_val; 
     var option_2_val = $scope.options.option_2_val; 
     console.log('genies',sc.genies); 

     var new_arr = []; 
     var each ; 
     each = sc.genies; 
     angular.forEach(each,function(val,key){ 
      var ob = {}; 
      ob = val; 

      var priceA = angular.fromJson(ob.price); 
      console.log('price',priceA);    

      var option = option_1_val.replace(" ","-")+","+option_2_val.replace(" ","-"); 
      console.log(option); 

      ob.price = priceA[option]; 

      console.log(ob); 
      new_arr.push(ob); 
     }); 

option = 'Non-Vegetarian,' (after calculating) 

sc.genies = [{"gs_id":"3","user_id":"25","service_id":"7","price":"{\"Vegetarian,Bengali\":\"200\",\"Vegetarian 
,Chinese\":\"3100\",\"Vegetarian,Gujarati\":\"800\",\"Vegetarian,Italian\":\"100\",\"Vegetarian,Maharashtrian 
\":\"100\",\"Vegetarian,Punjabi\":\"100\",\"Vegetarian,-South-Indian\":\"300\",\"Vegetarian,Thai\":\"100 
\",\"Non-Vegetarian,Bengali\":\"1100\",\"Non-Vegetarian,Chinese\":\"3100\",\"Non-Vegetarian,Gujarati 
\":\"100\",\"Non-Vegetarian,Italian\":\"100\",\"Non-Vegetarian,Maharashtrian\":\"100\",\"Non-Vegetarian 
,Punjabi\":\"100\",\"Non-Vegetarian,-South-Indian\":\"80\",\"Non-Vegetarian,Thai\":\"100\",\"Jain,Bengali 
\":\"2100\",\"Jain,Chinese\":\"2100\",\"Jain,Gujarati\":\"4100\",\"Jain,Italian\":\"100\",\"Jain,Maharashtrian 
\":\"100\",\"Jain,Punjabi\":\"100\",\"Jain,-South-Indian\":\"800\",\"Jain,Thai\":\"100\"}","min_price" 
:"80","max_price":"4100","username":"abdul quadir","email":"[email protected]","rating":"3"}] 

現在,當我重複sc.genie,我已經在一個新的變量已經「每一個」,然後我改變它採取「價格」每個數組未定義的關鍵,但奇怪的是當我看到在sc.genies中的控制檯價格價格也變爲「未定義」。咦!

我希望你明白我的觀點,請幫助我爲什麼會發生這種情況。

感謝

+1

每個都和sc.genies是指相同的對象。通過'var each = angular.copy(sc.genies);'創建一個副本,然後對'each'對象做任何你想做的事情,而不影響'sc.genies'。 – Lokesh

+0

這可以從var ob = {}縮短; ob = val;'到'var ob = val;'。沒有必要申報這個變量,然後立即將它覆蓋... –

回答

0

有一個簡單的答案。 「兩個」值之所以改變,是因爲它實際上是同一個對象。來自這一行angular.forEach(each,function(val,key){ ...的變量val包含一個指向對象的指針。這不是另一個對象。它是同一個對象,它只能通過不同的變量名訪問。

如果你真的想要originalworking copy爲不同的對象,那麼你需要手動創建具有相同值的新實例。

您可以創建一個這樣(好簡單對象)一個對象的副本:

var copy = JSON.parse(JSON.stringify(originalObject)); 

或在評論指出上面,你可以使用angular.copy(source, destination)。請參閱文檔https://docs.angularjs.org/api/ng/function/angular.copy

3

然後,您應該使用angular.copy,然後每個值的更改都不會影響原始值。因爲angular.copy在沒有參考的情況下在新變量中分配舊值。

像:的

var each ; 
each = angular.copy(sc.genies); 

代替

each = sc.genies; 
+0

完美。這是現在工作:)但我想知道爲什麼它發生在angularjs,而它不會發生在JavaScript –

+0

以及當你在另一個變量中分配一個變量值,然後還保留以前的引用與新的,這就是爲什麼當改變新的分配變量值,然後更改引用的變量值。當使用'angular.copy'時,不需要引用就可以創建新的變量。 –