2014-07-24 99 views
0

我的产品对象看起来有点像这样:JSON.stringify()导致无限循环(编辑:NO为逻辑。)

{name: 'abc', description: 'def', price: 100, quantity: 1, comment: '', customizations: []} 

定制关键是具有其它这样的产品的阵列在它的对象。你可以忽略这个问题。正如你可能已经注意到,评论定制键是使(理论上)相同产品(几乎)不同添加到购物车当钥匙。

我想做一个函数来将这些产品添加到名为cart_items []的数组中。如果选择(实际上)相同的产品,我只想增加cart_items [i]中的数量,否则添加一个新对象。

这是我的函数:

$scope.add_to_cart = function(product) { 
// if the cart is empty, skip the brouhaha 
      if ($scope.cart_items.length === 0) { 
       $scope.cart_items.push(angular.copy(product)); 
      } else { 
       for (var i = 0; i < $scope.cart_items.length; i++) { 
// copy the original quantity and set it to 1 for comparison 
        var qty = $scope.cart_items[i].quantity; 
        $scope.cart_items[i].quantity = 1; 
        if (JSON.stringify(product) === JSON.stringify($scope.cart_items[i])) { 
         $scope.cart_items[i].quantity = qty + 1; 
        } else { 
         $scope.cart_items[i].quantity = qty; 
         $scope.cart_items.push(angular.copy(product)); 
        } 
       } 
      } 
     }; 

问题:一是产品成功地增加了。添加另一个会导致无限循环。我用if(1 === 1)替换了if(JSON...),并且没有发生死循环。我不知道我哪里错了。任何帮助?

+0

这听起来像你有你的产品对象循环引用,自定义阵列可能英寸 – James

+0

另外''scope.cart_items [i] .quantity = qty;'在'else'中会改变每个产品的数量不匹配。之后的“推”也是错误的,它会一直在购物车中的每件商品添加一次产品。 – James

+0

@James它用物品的数量初始化。 –

回答

0

您遇到的问题是您正在增加循环中的数组大小,并且停止条件是i$scope.cart_items.length

如果你的目标是添加的对象,如果它还不存在,你想要什么大概是这样的:

boolean found = false; 
for (var i = 0; i < $scope.cart_items.length; i++) { 
    var qty = $scope.cart_items[i].quantity; 
    $scope.cart_items[i].quantity = 1; 
    if (JSON.stringify(product) === JSON.stringify($scope.cart_items[i])) { 
     $scope.cart_items[i].quantity = qty + 1; 
     found = true; 
     break; 
    } 
} 
if (!found) { 
    var item = angular.copy(product); 
    item.quantity = 1; 
    $scope.cart_items.push(); 
} 

需要注意的是两个相同的对象(即具有相同的属性值的对象)应该给予相同的JSON字符串,因为未指定属性迭代的顺序。它通常是有效的(特别是如果以明显的方式完成克隆),但不能保证。你真的应该根据属性而不是使用JSON字符串进行比较。

+0

哦,废话!我怎么没有注意到这一点!谢谢! –

0

你可能在递归循环进入,因为包含在自定义的对象,...

A [ customizations = B ] 
B [ customizations = C ] 
C [ customizations = A ] 
---------------------------- 
Infinite loop