使用新的键,值对象(如果存在)更新多维数组或创建新的
Updating multi-dimensional array with new key,value object if exists or create new
我有一个数组,它是
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;
}
相关文章:
- 如何为动态创建的文本区域中输入的值更新ng模型
- Knockout映射创建/更新出现问题
- 创建新对象时,为什么要更新旧对象
- 如何创建对表单的自我更新响应
- 在文本输入区域中创建双向更新
- 基本D3.js:创建或更新元素
- 如何创建独立于数组更新的组件列表
- 确定是创建新对象还是更新现有对象
- 更新脚本以针对具有递增 ID 的新创建的表行运行
- 创建使用 ajax 更新 iframe 的链接
- 通过两种方法创建和更新 CSS
- Sequelize多对多-如何创建新记录并更新联接表
- 检查文档是否已经存在,如果是则更新,否则创建新的Mongoose
- 如果正在创建或更新项目,请在模型“validate”内部进行区分
- 如何使用AJAX创建/更新单选按钮
- 在分析中创建或更新对象
- Mongoose创建一个文档,如果找不到指定的字段,则更新文档中的数组
- 如何为剑道网格创建、更新和删除IList中的数据
- 如何创建每秒更新真实数据的Hight Charts图表
- 动态更新/创建对象属性