我有一个
的数组 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。
在for循环中//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);
会创建mycart.length
次,然后我必须使用$unique() jQuery API
进行过滤,这是不好的方法。
我需要的是使用id:value,quantity:value
创建新对象(如果它不存在),如果它存在则再更新。更新零件工作,创建无法完成的零件,
答案 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);
}