如何检测数组中的相同元素并总结数量?
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.forEach
和 Array.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 < cartlist.length && !isFound;
。所以一旦找到一个项目,循环就会退出。通常,我反对使用跳转语句。以上是关于如何检测数组中的相同元素并总结数量?的主要内容,如果未能解决你的问题,请参考以下文章