使用新键,值对象(如果存在)更新多维数组或创建新数组

时间:2014-12-26 18:32:21

标签: javascript jquery arrays

我有一个

的数组
    var mycart = [{"id":"1","quantity":"10"},{"id":"6","quantity":"20"},{"id":"3","quantity":"30"},{"id":"4","quantity":"40"}];

   //new id's which should be updated
   var newid = "6";
   var newquantity = "5";

每次购物车更新我想更新ID和值,如果id存在,我需要更新数量,如果我不必创建id,quantity的新对象。 现在,我正在添加6的newid,因为你可以看到数组中存在id = 6所以它应该像这样更新 -

for(var x=0; x < mycart.length; x++){
    if(mycart[x].id == newid ){
        var tmpq = mycart[x].quantity;
        mycart[x].quantity = parseInt(tmpq) + parseInt(q);
    }
    else{
        alert(mycart[x].id+' = this is not what you are searching');
    }
}

现在的输出是:

var mycart = [{"id":"1","quantity":"10"},{"id":"6","quantity":"25"},{"id":"3","quantity":"30"},{"id":"4","quantity":"40"}];

现在我需要帮助来创建新对象,如果 mycart 数组中没有该ID。

  • 如果我使用
 //new id's which should be created
    var newid = "2";
    var newquantity = "15";
    var temparr = new Array();
    var tmpobj ={}; 
      tmpobj["id"]= newid ;
      tmpobj["quantity"] = newquantity ;
      temparr.push(tmpobj);
    mycart.push(temparr);
在for循环中

会创建mycart.length次,然后我必须使用$unique() jQuery API进行过滤,这是不好的方法。

我需要的是使用id:value,quantity:value创建新对象(如果它不存在),如果它存在则再更新。更新零件工作,创建无法完成的零件,

4 个答案:

答案 0 :(得分:1)

使用变量来检测您是否找到了旧项目:

var found = false;
for(var x=0; x < mycart.length; x++){
    if(mycart[x].id == newid ){
        var tmpq = mycart[x].quantity;
        mycart[x].quantity = parseInt(tmpq) + parseInt(q);
        found = true;
        break;
    }
}
if (!found) {
    mycart.push ({ id: newid, quantity: newquantity });
}

如果您将mycart作为ID为对象的对象会更简单,那么您就不必进行线性搜索。它会是这样的:

var mycart = {
    "1": { quantity: 10 },
    "6": { quantity: 20 },
    ...
};

然后你的代码将是:

if (mycart.hasOwnProperty(newid)) {
    mycart[newid] += newquantity;
} else {
    mycart[newid] = { quantity: newquantity };
}

答案 1 :(得分:1)

这样的事情怎么样?

updateCart = function(newid,newquantity,cart){
    for(var x=0; x < mycart.length; x++){
        if(mycart[x].id == newid ){
            var tmpq = cart[x].quantity;
            cart[x].quantity = parseInt(tmpq) + parseInt(newquantity);
            return;
        }
        else{
            alert(mycart[x].id+' = this is not what you are searching');
        }
    }
    cart.push({"id":newid,"quantity":newquantity});
    return;
};

这避免了任何'标志'变量,恕我直言很好。然后你可以这样称呼它:

updateCart("6","5",mycart); //[..{"id":"6","quantity":"25"}..]
updateCart("10","7",mycart); //[..{"id":"10","quantity":"7"}](new array member)
updateCart("1","5",mycart); //[{"id":"1","quantity":"15"}...]
但是,我必须同意其他人,当他们说你可能想要使用某种键时,所以你不必每次都遍历数组。

答案 2 :(得分:0)

由于数组没有理由包含具有相同id的多个对象,我建议您使用对象作为变量的根,使用id作为数组键(+前缀以避免混淆) ):

var mycart = {"item_1":{"id":"1","quantity":"10"},"item_6":{"id":"6","quantity":"20"},...};

这样您就可以使用mycart["item_"+id].quantity

设置/获取数量

所以你可以这样更新:

function updateQuantity(id, quantity){
    if(!mycart["item_"+id]){
        // create item in cart
        mycart["item_"+id] = {"id":id};
    }
    // update quantity
    mycart["item_"+id].quantity = quantity;
}

答案 3 :(得分:0)

要创建新项目,我会这样做:

var match = false;

for (var x = 0; x < mycart.length; x++) {
    var id = mycart[x].id;

    //If there's a match, then item already exists
    if (id === newid) {
        //Update it
        var tmpq = mycart[x].quantity;
        mycart[x].quantity = parseInt(tmpq) + parseInt(q);  //I'm not sure what q is, but I will leave it since you said it works in your code
        match = true;
    }
}

//If no match found, create new
if (!match) {
    var newItem = {};
    newItem.id = newid;
    newItem.quantity = newquantity;
    mycart.push(newItem);
}