我的产品对象看起来像这样:
{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)
,并且没有发生无限循环。我不知道我哪里错了。有什么帮助吗?
答案 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