从数组javascript中的对象中删除和替换项
我已经阅读并尝试了SO关于这个主题的所有帖子,但由于某种原因,没有一个答案能提供预期的效果 我已经编写了一个购物篮程序,一旦用户单击“立即购买”按钮,我希望发出包含用户订单对象的POST请求 问题 用户可以选择购买三种不同的物品。每次用户点击一个项目,这是一个html输入框,以增加他们希望购买的金额,我想更新对象,只包含最近选择的金额 在最简单的格式中,篮子在启动时如下所示:从数组javascript中的对象中删除和替换项,javascript,jquery,arrays,Javascript,Jquery,Arrays,我已经阅读并尝试了SO关于这个主题的所有帖子,但由于某种原因,没有一个答案能提供预期的效果 我已经编写了一个购物篮程序,一旦用户单击“立即购买”按钮,我希望发出包含用户订单对象的POST请求 问题 用户可以选择购买三种不同的物品。每次用户点击一个项目,这是一个html输入框,以增加他们希望购买的金额,我想更新对象,只包含最近选择的金额 在最简单的格式中,篮子在启动时如下所示: var basket = {items:[ {item:"Trousers",
var basket = {items:[
{item:"Trousers", quantity:1, cost:"10"},
{item:"Trainers", quantity:1, cost:"5"},
{item:"Jacket", quantity:1, cost:"30"}
]}
每次用户单击“输入”按钮时,我都希望更新篮子,因此如果用户单击将夹克数量增加到3,将裤子数量增加到4,我希望对象如下所示:
var basket = {items:[
{item:"Trousers", quantity:4, cost:"40"},
{item:"Trainers", quantity:1, cost:"5"},
{item:"Jacket", quantity:3, cost:"90"}
]}
var basket = {items:[
{item:"Trousers", quantity:3, cost:"30"},
{item:"Trainers", quantity:1, cost:"5"},
{item:"Jacket", quantity:3, cost:"90"}
]}
然后,如果用户决定将裤子的数量减少1到3,我希望basket.items对象如下所示:
var basket = {items:[
{item:"Trousers", quantity:4, cost:"40"},
{item:"Trainers", quantity:1, cost:"5"},
{item:"Jacket", quantity:3, cost:"90"}
]}
var basket = {items:[
{item:"Trousers", quantity:3, cost:"30"},
{item:"Trainers", quantity:1, cost:"5"},
{item:"Jacket", quantity:3, cost:"90"}
]}
我已经为所有计算等编写了代码。因此,这不是问题所在,但问题是更新basket.items
,一次只包含上面列出的三个项目,以及最新数据
我不能使用过滤方法,因为这需要在旧版本的IE中工作。我已经尝试了中列出的所有解决方案,以及更多的解决方案,但这些答案都不能提供我正在寻找的解决方案
如果需要更多信息,请告诉我。尝试以下方法:
var basket = {
items: [
{
item: "Trousers",
quantity: 1,
cost: "10"
}, {
item: "Trainers",
quantity: 1,
cost: "5"
}, {
item: "Jacket",
quantity: 1,
cost: "30"
}]
};
function updateBasket(item) {
basket.items = basket.items.map(function (product) {
if (product.item == item.item) return item;
else return product;
});
}
updateBasket({
item: "Jacket",
quantity: 9,
cost: "30"
});
updateBasket({
item: "Trainers",
quantity: 9,
cost: "30"
});
console.log(basket)
- 成本应该是数字,而不是字符串
- 如果您没有为1件物品的价格保留一个全局对象,那么一旦您更新了
篮子
对象,您将丢失1件物品的价格信息,您将不知道该增加多少价格
var basket = {items:[
{item:"Trousers", quantity:4, itemCost:40, totalCost:40},
{item:"Trainers", quantity:1, itemCost:5, totalCost:5},
{item:"Jacket", quantity:3, itemCost:90, totalCost:90},
]}
function updateQuantity(itemName, qIncreaseBy, qDecreaseBy){
console.log(basket);
for(var propt in basket.items){
if(basket.items[propt].item == itemName){
if(qIncreaseBy != 0){
basket.items[propt].quantity = (basket.items[propt].quantity + 1);
basket.items[propt].totalCost = (basket.items[propt].totalCost + basket.items[propt].itemCost);
} else{
basket.items[propt].quantity = (basket.items[propt].quantity - 1);
basket.items[propt].totalCost = (basket.items[propt].totalCost - basket.items[propt].itemCost);
}
break;
}
}
console.log(basket);
}
用法:
updateQuantity("Trainers", 0, 1); //To add item
updateQuantity("Trainers", 1, 0) //To remove item
不知道对于您来说,拥有一个对象数组是否是必需的,如果不是这样,您可以以不同的方式构造数据,例如
basket = { items : { item_1 : { quantity: 1, cost: 1 } } }
因此,更新篮子将非常简单
function updateBasket(item, value) {
// item -> item_1
// value - > { quantity: 2, cost: 2}
basket['items'][item] = value;
}
老实说,我认为如果你以一种稍微不同的方式保存数据,问题是可以解决的。比如像这样的
var products = {
trousers:0,
jackets:0,
trainers:0,
};
var prices = {
trainers:5,
jackets: 30,
trousers: 10
}
//to increase the amount of products after user event
products.jackets +=2;
products.trainers +=3;
products.trousers +=1;
//finally generate your desired format
var basket = {items:[]};
for(product in products){
basket.items.push({
item: product,
quantity: products[product],
cost: products[product]*prices[product]
});
}
console.log(basket);
你可以看到篮子现在是你想要的格式:)你考虑过使用吗?谢谢Jeroen。我不知道这件事。然而,即使使用过滤器,我仍然无法达到预期的效果。但理想情况下,我不想使用它,而是希望找到另一个解决方案更改数据结构篮={items:{item_a:{q:1,cost:10}}}@elio.d感谢您的回复。你是什么意思?你能详细说明一下吗?谢谢,但这并不能更新我的成本,而且如果用户减少了金额,它也不能提供所需的result@PaulFitzgerald明白了,伙计,请看我对原始答案的编辑。不幸的是,这不起作用。语法是否绝对正确?basket的语法是否正确?我可能错了,但它是否缺少一个
:
谢谢,感谢您的帮助。上面Nikolay提供的解决方案有效该解决方案的唯一问题是,您必须在所有篮子中循环O(n)。谢谢,这是第一次有效,但之后我收到以下消息:无法读取未定义的属性“map”
谢谢,它应该只适用于更新卡。所有关于应使用其他函数进行的数量计算;)其他的计算都已排序,所以我已经到达了我想要的位置