Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript stringify()导致无限循环(编辑:否。错误的逻辑是。)_Javascript_Angularjs - Fatal编程技术网

Javascript stringify()导致无限循环(编辑:否。错误的逻辑是。)

Javascript stringify()导致无限循环(编辑:否。错误的逻辑是。),javascript,angularjs,Javascript,Angularjs,我的产品对象看起来有点像这样: {name: 'abc', description: 'def', price: 100, quantity: 1, comment: '', customizations: []} customizations键是一个数组,其中包含其他此类产品对象。对于这个问题,你可以忽略它。正如您可能已经注意到的,注释和自定义键是使理论上相同的产品在添加到购物车时实际上有所不同的键 我想创建一个函数,将此类产品添加到名为cart_items[]的数组中。如果选择了几乎相同的

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

{name: 'abc', description: 'def', price: 100, quantity: 1, comment: '', customizations: []}
customizations键是一个数组,其中包含其他此类产品对象。对于这个问题,你可以忽略它。正如您可能已经注意到的,注释和自定义键是使理论上相同的产品在添加到购物车时实际上有所不同的键

我想创建一个函数,将此类产品添加到名为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));
                    }
                }
            }
        };

问题是:第一个产品添加成功。添加另一个会导致无限循环。我替换了ifJSON。。。当if1==1时,无限循环没有发生。我不知道我哪里做错了。有什么帮助吗?

您遇到的问题是正在增加循环中数组的大小,停止条件是i为$scope.cart\u 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

听起来您的产品对象中有一个循环引用,可能在customizations数组中。还有$scope.cart\u items[i]。quantity=qty;在你的计划中,else将改变每个不匹配的产品的数量。之后的推送也是错误的,它将继续为购物车中已有的每件商品添加一次产品。@James它已用商品的数量初始化。@James:在这种情况下,我将稍后将其设置回“数量”。好的,我看到,“数量”这件事仍然很奇怪,没有必要,尽管没有错。但推动是错误的。你想循环购物车项目,然后在循环后添加新项目,如果在循环过程中找不到。哦,糟了!我怎么没有注意到这一点!谢谢