【问题标题】:How to detect same element in array and sum up qty?如何检测数组中的相同元素并总结数量?
【发布时间】:2021-11-25 09:25:01
【问题描述】:

如何检测MY CART中是否存在所选产品代码,如果产品代码存在,则不要将其插入MY CART数组中,而是将所选产品的数量添加到MY CART中的现有产品中。

我编写的代码会将所有选择的产品添加到我的购物车中,这对于看到所有相同的产品堆积起来并不是很有效。如果产品存在,最好有这个功能来汇总数量。

var cartlist= new Array();
$(".addtocart").on('click', function() {
   var prdcode = $("#prod_code");
   var description = $("#prod_desc");
   var qty= $("#prod_qty");
   var itemlist = new Array();

   itemlist.push(prdcode );
   itemlist.push(description );
   itemlist.push(qty);

   cartlist.push(itemlist);

   for (var i = 0; i < cartlist.length-1; i++) {
      if(cartlist[i+1] === cartlist[i]){
         continue;
         //action to sum qty if code exist in cart 
      }
   }
});
MY CART
0: Array(3){
     0: "ABC123"
     1: "DESCRIPTION FOR ABC123"
     2: "1"
}
1: Array(3){
     0: "DEF456"
     1: "DESCRIPTION FOR DEF456"
     2: "2"
}
TO BE ADDED IN CART
0: Array(3){
     0: "ABC123"
     1: "DESCRIPTION FOR ABC123"
     2: "1"
}
1: Array(3){
     0: "GHI789"
     1: "DESCRIPTION FOR GHI789"
     2: "1"
}
EXPECTED OUTCOME (AFTER ADDED IN CART)
0: Array(3){
     0: "ABC123"
     1: "DESCRIPTION FOR ABC123"
     2: "2"
}
1: Array(3){
     0: "DEF456"
     1: "DESCRIPTION FOR DEF456"
     2: "2"
}
2: Array(3){
     0: "GHI789"
     1: "DESCRIPTION FOR GHI789"
     2: "1"
}

【问题讨论】:

  • 循环遍历购物车,数组find(),如果find找到数组,增加。如果它不推它。
  • 大量的solutions herethis answer 似乎最接近你需要的一些小调整。

标签: jquery arrays


【解决方案1】:

逻辑应该是,在您将商品推送到购物车之前,请检查商品是否已存在于购物车中。如果存在更新它,如果不推送它。

如果你使用for循环,你必须在两个循环中进行

工作代码

var cartlist = new Array();
cartlist.push(["ABC123", "DESCRIPTION FOR ABC123", "1"]);
cartlist.push(["DEF456", "DESCRIPTION FOR DEF456", "2"]);

var itemlist = new Array();
itemlist.push(["ABC123", "DESCRIPTION FOR ABC123", "1"]);
itemlist.push(["GHI789", "DESCRIPTION FOR GHI789", "1"]);

$(".addtocart").on('click', function () {
  // Donot push directly without checking
  // cartlist.push(itemlist);
  for (var i = 0; i < itemlist.length; i++) {
    let isFound = false; 
    for (var j = 0; j < cartlist.length && !isFound; j++) {
      if(cartlist[j][0] === itemlist[i][0] && cartlist[j][1] === itemlist[i][1]) {
        cartlist[j][2] = (+cartlist[j][2] + +itemlist[i][2]).toString();
        isFound = true;
      }
    }
    if(!isFound) {
      cartlist.push(itemlist[i]);
    }
  }
  console.log(cartlist);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<button class="addtocart">Add</button>

您也可以简单地使用 Array.forEachArray.find 来完成。

var cartlist = new Array();
cartlist.push(["ABC123", "DESCRIPTION FOR ABC123", "1"]);
cartlist.push(["DEF456", "DESCRIPTION FOR DEF456", "2"]);

var itemlist = new Array();
itemlist.push(["ABC123", "DESCRIPTION FOR ABC123", "1"]);
itemlist.push(["GHI789", "DESCRIPTION FOR GHI789", "1"]);

$(".addtocart").on('click', function () {
  // Donot push directly without checking
  // cartlist.push(itemlist);
  itemlist.forEach((item) => {
    const itemFromCart = cartlist.find((node) => node[0] === item[0] && node[1] === item[1]);
    if(itemFromCart) {
      itemFromCart[2] = (+itemFromCart[2] + +item[2]).toString();
    } else {
      cartlist.push(item);
    }
  })
  console.log(cartlist)
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 
<button class="addtocart">Add</button>

【讨论】:

  • 小调整:将isFound = true; 更改为isFound = true; break; - 对于小数组,这不会有太大的区别,但是如果有很多重复的行,它可以有10s 的1000s 的帮助。
  • 同样,我以不同的方式实现。我将 for 的条件用作j &lt; cartlist.length &amp;&amp; !isFound;。所以一旦找到一个项目,循环就会退出。通常,我反对使用跳转语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多