【问题标题】:How to remove array object cases after switch statement如何在 switch 语句后删除数组对象案例
【发布时间】:2019-03-18 21:48:38
【问题描述】:

我有一个菜单系统,如果某些商品出现在购物车中,我有一些代码供结帐系统识别交易/折扣。

这是目前为止的代码:

        var shampoo = false;
        var dye = false;
        var conditioner = false;


            for (var i in cartArray) {
                switch (cartArray[i].name) {
                        case 'Pantene Pro-V':
                        drinks = true;
                        break;
                        case 'Red Dye':
                        chicken = true;
                        break;
                        case 'Herbal Conditioner':
                        kebab = true;
                        break;
                }
                if (shampoo && dye && conditioner) {
                console.log("yes");
                // shoppingCart.removeItemFromCartAll(cartArray[i].name);
                // window.location.reload(true);
                break;
            }
        }
        if (!shampoo || !dye || !conditioner) {
            console.log("no");
        }

控制台日志在完整的随机购物车中显示“是”,所以这是肯定的,但我尝试将这三个项目作为一个组一起删除,但它不起作用。

这是我上面删除功能的代码:

      obj.removeItemFromCartAll = function(name) {// removes all item name
        for (var i in cart) {
            if (cart[i].name === name){
                cart.splice(i,1);
                break;
            }
        }
        saveCart();
    };

我尝试插入此代码:

     shoppingCart.removeItemFromCartAll(cartArray[i].name);

在每个箱子下面,但它最终会在购物车中单独移除物品,而不是三个一组。

这是控制台的样子(数组对象):

       yes

      (4) [{…}, {…}, {…}, {…}]

       0: {name: "Pantene Pro-V", price: 2.5, count: 1, total: 
       "2.50"}
       1: {name: "Red Dye", price: 4, count: 1, total: "4.00"}
       2: {name: "deodorant", price: 2.5, count: 1, total: "2.50"}
       3: {name: "Herbal Conditioner", price: 1, count: 1, total: "1.00"}
       length: 4
       __proto__: Array(0)

请帮忙。谢谢。

顺便说一句,最后我想删除这三个并从菜单中将另一个项目添加到购物车中(比如以折扣价包含这三个的包裹......仅供参考)。

编辑 - 在这里注释掉这部分

 shoppingCart.removeItemFromCartAll(cartArray[i].name); 

删除购物车中的最后一项并用 splice 方法替换删除删除整个购物车并破坏购物车系统

【问题讨论】:

    标签: javascript arrays object if-statement switch-statement


    【解决方案1】:

    据我了解这段代码,它只正确删除了一项

    cart.splice(i,1);
    

    在这里您提供了1,这意味着它将从作为第一个参数提供的索引中向前删除一项。尝试将其更改为 3。

    更糟糕的情况是,如果您有隆隆的阵列,而这 3 个项目不是一个接一个。然后充其量你应该创建一些属性,将项目分配给特定的组,然后使用数组的filter 方法过滤掉你想要删除的组的项目

    【讨论】:

    • 将拼接值从 1 更改为 3 与不更改它的效果相同,无论购物车中有多少不同的商品。 3: {name: "Herbal Conditioner", price: 1, count: 1, total: "1.00"} 刚刚被删除。
    • @risingmoon77 我明白了。它在组的第三个项目之后触发删除方法(因为首先它需要检查前两个是否存在)。因此,您不仅需要将 splice 从 1 设置为 3,还需要将索引设置为 i - 2。然后它应该从组中删除 3 个项目(当然,如果它们是在彼此之后)
    【解决方案2】:

    使用删除关键字

    obj.removeItemFromCartAll = function(name) {// removes all item name
            for (var item in cart) {
                if (cart[item].name === name){
                    delete cart[item]
                    break;
                }
            }
            saveCart();
        };
    

    【讨论】:

    • 用拼接方法代替删除会删除整个购物车并破坏购物车系统
    【解决方案3】:

    “在每个箱子下面,但它最终会在购物车中单独移除物品,而不是三个一组。”

    三个或三个单独的项目组并不重要,重要的是它们被删除了。应考虑诸如客户拥有少于 3 个销售项目或根本没有销售项目和/或不在同一订单中的情况。用作过滤器的开关是一个坏主意,您希望避免对动态数据进行硬编码(我假设购物车中的商品对于每个客户都会有所不同,并且销售商品最终也会发生变化。)

    演示大纲

    1. list 表示客户购物车内容的对象数组。
    2. sale 代表当前销售商品的对象数组。
    3. 将两个数组转换为地图。
      var discount = convertToMap(list, "name")
      var customer = convertToMap(sale, "name")
      
    4. 比较 discountcustomer 映射并将每个匹配的键/值对从 discount 合并到 customer.
    5. 结果是具有这种模式的地图:
       `[["Muffin Mix - Raisin Bran", {"name":"Muffin Mix - Raisin Bran","price":5.85,"qty":1,"total":2.92,"saved":2.93}], ...]`
      

    演示

    // Sale Items - Note the "total" and "saved" values
    let sale = [
    {"name":"Flavoring - Orange","price":4.57,"qty":1,"total":2.00,"saved":2.57},
    {"name":"Muffin Mix - Raisin Bran","price":5.85,"qty":1,"total":2.92,"saved":2.93},
    {"name":"Pepsi - Diet, 355 Ml","price":3.63,"qty":1,"total":1.81,"saved":1.82}
    ]; 
    
    // Cart Items - This represents the customer's cart
    let cart = [
    {"name":"Plastic Arrow Stir Stick","price":0.75,"qty":1,"total":0.75,"saved":0},
    {"name":"Veal - Round, Eye Of","price":22.91,"qty":1,"total":22.91,"saved":0},
    {"name":"Calypso - Pineapple Passion","price":8.69,"qty":1,"total":8.69,"saved":0},
    {"name":"Sloe Gin - Mcguinness","price":33.27,"qty":1,"total":33.27,"saved":0},{"name":"Wine - Sake","price":28.47,"qty":1,"total":28.47,"saved":0},
    {"name":"Dried Figs","price":1.78,"qty":1,"total":1.78,"saved":0},
    {"name":"Pepsi - Diet, 355 Ml","price":3.63,"qty":1,"total":3.63,"saved":0},
    {"name":"Olives - Moroccan Dried","price":15.17,"qty":1,"total":15.17,"saved":0},
    {"name":"Muffin Mix - Raisin Bran","price":5.85,"qty":1,"total":5.85,"saved":0}
    ];
    
    /*
    @ convertToMap(array, key) 
    @ Params: array [Array of Objects]..(ex. list)
    @         key [String]..............(ex. "name")
    @ Converts an Array of Objects to a MAP
    @ iNPUT: [{key,...}, {key,...}, {key,...}], key
    @ ~~~~~~~~~~~~~~===~~~~~~~~~~~~~~~
    @ OUTPUT: [[key, {key,...}], [key, {key,...}], [key, {key,...}]]
    */
    const convertToMap = (array, key) => {return new Map(array.map(item => [item[key], item]));};
    
    // Get a Map of sale
    const discount = convertToMap(sale, 'name');
    // Get a Map of cart
    const customer = convertToMap(cart, 'name');
    
    /*
    @ mergeMaps(mapA, mapB)
    @ Params: mapA [Map]...smaller Map...(ex. [[...], [...]])
    @         mapB [Map]...larger Map....(ex. [[...], [...]])
    @ Compares MapA to MapB
    @ If any matches by value occur, 
    @ replace MapB key/value with MapA key/value
    */
    const mergeMaps = (mapA, mapB) => {
      for (let key of mapB.keys()) {
        if (mapA.has(key)) {
          mapB.set(key, mapA.get(key));
        }
      }
      return mapB;
    };
    
    let shoppingA = mergeMaps(discount, customer);
    
    console.log(shoppingA.get("Sloe Gin - Mcguinness"));
    console.log("~~~~~~~~~~~~~~~~~~~~~-====-~~~~~~~~~~~~~~~~~~~~~");
    
    // [OPTION] Convert new Map to a 2D Array 
    let shoppingB = Array.from(mergeMaps(discount, customer));
    
    console.log(shoppingB);

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多