如何检测数组中的相同元素并总结数量?

Posted

技术标签:

【中文标题】如何检测数组中的相同元素并总结数量?【英文标题】: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 here 而this answer 似乎最接近你需要的一些小调整。 【参考方案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;。所以一旦找到一个项目,循环就会退出。通常,我反对使用跳转语句。

以上是关于如何检测数组中的相同元素并总结数量?的主要内容,如果未能解决你的问题,请参考以下文章

作业七总结

第七次课堂总结

1.29总结

如何获取指针数组中的元素数量?

如何检测一个元素是不是是数组中的最后一个元素?

如何获取两个数组相同元素