从数组javascript中的对象中删除和替换项

从数组javascript中的对象中删除和替换项,javascript,jquery,arrays,Javascript,Jquery,Arrays,我已经阅读并尝试了SO关于这个主题的所有帖子,但由于某种原因,没有一个答案能提供预期的效果 我已经编写了一个购物篮程序,一旦用户单击“立即购买”按钮,我希望发出包含用户订单对象的POST请求 问题 用户可以选择购买三种不同的物品。每次用户点击一个项目,这是一个html输入框,以增加他们希望购买的金额,我想更新对象,只包含最近选择的金额 在最简单的格式中,篮子在启动时如下所示: var basket = {items:[ {item:"Trousers",

我已经阅读并尝试了SO关于这个主题的所有帖子,但由于某种原因,没有一个答案能提供预期的效果

我已经编写了一个购物篮程序,一旦用户单击“立即购买”按钮,我希望发出包含用户订单对象的POST请求

问题

用户可以选择购买三种不同的物品。每次用户点击一个项目,这是一个html输入框,以增加他们希望购买的金额,我想更新对象,只包含最近选择的金额

在最简单的格式中,篮子在启动时如下所示:

 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”
谢谢,它应该只适用于更新卡。所有关于应使用其他函数进行的数量计算;)其他的计算都已排序,所以我已经到达了我想要的位置