我的javascript对象有问题,数组试图更新"数量"如果再次选择所选项目。
我使用的对象定义如下:
var Cart = {
User: 0,
Store: 0,
UserID: 0,
Deliver: "Entrega",
Date: "2014-01-01",
Total: 0,
ProductsCart: []
};
在ProductsCart中,Im创建的数组如下:
Cart.ProductsCart.push({
"ProductID": id, //value sent from javascript function
"Quantity": Number(Quantity),
"Price": Price.toFixed(2),
"Name": name,
"Desc": desc,
"Date": date,
"StoreID": store,
"UserID": Number(UserID) //Special
我现在面临的问题是我有一个javascript代码可以再次更新所选产品的数量,如果存在,它会更新数量,但有时它可以工作,有时不会。这是代码
var temp = {},
i;
for (i = Cart.ProductsCart.length - 1; i >= 0; i -= 1) {
ProductID = Cart.ProductsCart[i].ProductID;
UserID = Cart.ProductsCart[i].NinoID;
if (temp.hasOwnProperty(ProductID) && temp.hasOwnProperty(UserID)) {
Cart.ProductsCart[temp[ProductID]].Quantity += Cart.ProductsCart[i].Quantity;
//Splice to make one array with updated quantity?
Cart.ProductsCart.splice(i, 1);
} else {
temp[ProductID] = i;
//I need to identify one product per user and filter the productos by user so Im using that UserID to identify every array per user
temp[UserID] = UserID;
}
}
console.log(Cart.ProductsCart);
现在的问题是,有时它会将特定数量添加到产品中,如
但由于某些原因,对于同一个用户或不同的用户,我尝试添加蛋糕,数量1 披萨或饮料的数量发生了变化,蛋糕不再存在。希望你能指导它的问题所在 提前致谢
修改-------------
原始脚本(我的)与特定产品一起使用,因为做了一些测试我发现我使用fullcalendar并且在特定日期的每次点击代码都不起作用,但如果我不点击代码就可以了。
其他的事情是,我使用AJAX按类别带来产品,问题是没有获得ID,问题是他们没有识别现有的数组
答案 0 :(得分:0)
假设您的数组如下所示:
Pizza 4
Cake 3
Pizza 2
Pizza 5
Drink 2
在i = 2时,你合并了两条披萨线并将其中一条拼接出来:
Pizza 4
Cake 3
Pizza 7
Drink 2
问题是,现在你的Pizza系列是索引2而不是3,但你仍然有temp.Pizza = 3
。因此,在i = 0时,您将错误地合并到Drink行,该行现在位于索引3处。
一种解决方案是在合并而不是向后时向前推进数组,然后splice()
产品的后续重复,将第一个留在您记录的索引处。然后确保在拼接后执行i -= 1
,这样您就可以再次查看该索引,因为其他项目已移入该索引。
答案 1 :(得分:0)
你的问题是你在循环中拼接你的阵列,这将导致不良影响。您正在为数组中的每个项迭代一个数组,但是在迭代时您正在更改该数组中的项。你能看出这会给你带来什么问题吗? :)
举个例子,您可以在此jsfiddle上看到演示。
var arr = [
"one",
"two",
"three",
"four",
"five"
];
console.log('Without Splice ...');
for ( var i = 0; i <= arr.length - 1; i++ ) {
console.log(arr[i]);
}
console.log('With Splice ...');
for ( var i = 0; i <= arr.length - 1; i++ ) {
console.log(arr[i]);
arr.splice(i, 1);
}
第一次迭代记录每个项目,正如您所期望的那样。但是,第二次迭代仅记录每个其他项目(一,三,五)。更安全的做法是跟踪要在临时数组中删除的项目,然后在完成迭代时,根据临时数组中的内容从源中删除项目。
答案 2 :(得分:-1)
很抱歉,我只是没有关注你的结构。
我要做的是让你拥有一组Cart
个对象,每个Cart
对象都有基本项目,例如购物车所属的用户以及哪些项目和数量项目:
/**
* @constructor
*/
var Cart = function(){
var userID;
var items = [];
// array of Item
...
};
/**
* method for checking if item exists in cart
*/
Cart.prototype.hasItem = function(item){
for (var i = 0; i < this.items.length; i++){
if (this.items[i].itemId === item.itemId){
return true;
}
}
return false;
}
/**
* method for checking if item exists in cart
*/
Cart.prototype.updateItemQty= function(item, difference){
for (var i = 0; i < this.items.length; i++){
if (this.items[i].itemId === item.itemId){
this.items[i].qty += difference;
}
}
}
定义项目:
var Item = function() {
var ItemId;
var qty;
...
}
然后保留一个Cart数组
var carts = [];
现在提供了将项目添加到特定购物车的方法或功能
function addItem(item, userId){
for (var i = 0; i < carts.length; i++){
if (carts[i].userId === userId){
// add or update item
if (carts[i].hasItem(item)){
carts[i].updateItemQty(item, 1);
} else {
carts[i].addItem(item);
}
} else {
// add a new cart to carts array first
// then add the item to that new cart
}
}
}