具有相同键的JSON数组的总和数量

时间:2014-05-06 15:51:08

标签: javascript arrays json

我的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
  • 饮料,数量1

但由于某些原因,对于同一个用户或不同的用户,我尝试添加蛋糕,数量1 披萨或饮料的数量发生了变化,蛋糕不再存在。希望你能指导它的问题所在 提前致谢

修改-------------

原始脚本(我的)与特定产品一起使用,因为做了一些测试我发现我使用fullcalendar并且在特定日期的每次点击代码都不起作用,但如果我不点击代码就可以了。

其他的事情是,我使用AJAX按类别带来产品,问题是没有获得ID,问题是他们没有识别现有的数组

3 个答案:

答案 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
        }
    }

}