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

Updating multi-dimensional array with new key,value object if exists or create new

本文关键字:更新 创建 存在 数组 对象 如果      更新时间:2023-09-26

我有一个数组,它是

    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的新对象。现在,我正在添加 newid,它是 6,因为您可以看到数组中存在 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的新对象,如果它不存在,那么只需更新。更新零件工作,创建零件无法,

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

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 };
}

这样的事情呢?

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"}...]

不过,我必须同意其他人的观点,当他们说您可能想要使用某种键时,这样您就不必每次都遍历数组。

要创建一个新项目,我会做:

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);
}

由于数组没有理由包含具有相同 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;
}