JSON.stringify()导致无限循环(编辑:NO。错误的逻辑是。)

时间:2014-07-24 11:51:42

标签: javascript angularjs

我的产品对象看起来像这样:

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

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(JSON...)替换为if(1 === 1),并且没有发生无限循环。我不知道我哪里错了。有什么帮助吗?

2 个答案:

答案 0 :(得分: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字符串化。

答案 1 :(得分:0)

由于自定义中包含的对象,您可能会进入递归循环...

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