【问题标题】:when changing value of copied variable it is also changing main variable value in angularjs当更改复制变量的值时,它也在更改 angularjs 中的主变量值
【发布时间】:2016-05-06 20:33:43
【问题描述】:

我的情况很奇怪。我有一个对象数组,我使用 angular.forEach 来修改每个对象的价格键值,但是当我在每个对象中更改它时,它也在更改主数组对象。

看看代码,你就会明白我想说什么。

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":"abdul.quadir@kiozen.com","rating":"3"}]

现在当我重复 sc.genie 时,我已经将它放入一个新变量“每个”,然后我将每个数组的“price”键更改为未定义但 奇怪 点是当我在控制台中看到 sc.genies 中的价格值也更改为“未定义”时。嗯!

我希望你明白我的意思,请帮助我为什么会发生这种情况。

谢谢

【问题讨论】:

  • each 和 sc.genies 都指向同一个对象。通过var each = angular.copy(sc.genies); 创建一个副本,然后对each 对象做任何你想做的事情,而不影响sc.genies
  • 这可以从var ob = {}; ob = val;缩短到var ob = val;。无需声明变量,然后立即覆盖它...

标签: javascript arrays angularjs foreach reference


【解决方案1】:

您应该使用angular.copy,然后当每个值的更改不影响原始值时。因为angular.copy 在新变量中分配旧值而不引用。

喜欢:

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

而不是

each = sc.genies;

【讨论】:

  • 完美。这现在可以工作了:) 但我想知道为什么它发生在 angularjs 而它没有发生在 javascript 中
  • 好吧,当您在另一个变量中分配一个变量值时,还要将先前的引用与新的引用保持一致,这就是为什么在更改新分配的变量值时然后更改引用的变量值的原因。使用angular.copy 时,创建不带引用的新变量。
【解决方案2】:

有一个简单的答案。 “两个”值发生变化的原因是因为它实际上是同一个对象。这行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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多