我的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