JSON.stringify()导致无限循环(编辑:NO.坏逻辑是)

JSON.stringify() causing an infinite loop (Edit: NO. Bad logic is.)

本文关键字:NO 无限循环 stringify JSON 编辑      更新时间:2023-09-26

我的product对象看起来是这样的:

{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),并且没有发生无限循环。我不知道我哪里出错了。任何帮助吗?

您遇到的问题是,您正在增加循环中数组的大小,并且停止条件是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字符串化的

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

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