JS Set 无法同时实现唯一添加和数量统计,因其仅支持去重而不记录次数;推荐用 Map 以商品 ID 为 key、数量为 value,支持增删改查与总数计算。

JS Set 本身只存储唯一值,不能直接记录商品数量,所以单纯用 Set 无法完成“唯一添加 + 数量统计”两个需求。需要搭配 Map 或普通对象来维护数量,Set 只负责去重逻辑(可选)。实际推荐用 Map 作为主数据结构,它天然支持键值对、唯一键、动态增删和数量更新。
为什么不用纯 Set?
Set 的每个元素必须是独立值(如字符串、对象引用),但同一商品多次加入时:
- 若用商品 ID 字符串,重复 add 不会报错,但无法知道加了几次;
- 若用对象(如 {id: 'p1', count: 1}),每次 new 一个新对象,Set 认为是不同元素,起不到去重作用;
- Set 没有内置方法获取/更新某个元素的属性。
推荐方案:用 Map 管理商品 + 数量
以商品 ID(字符串)为 key,数量(number)为 value,简洁高效:
- 添加商品:
cart.set(id, (cart.get(id) || 0) + 1) - 删除一个:
cart.set(id, Math.max(0, (cart.get(id) || 0) - 1)),减到 0 后可cart.delete(id) - 清空:
cart.clear() - 获取总件数:
[...cart.values()].reduce((a, b) => a + b, 0) - 获取商品种类数(即唯一 ID 数):
cart.size
如果坚持用 Set + 辅助结构,怎么配合?
可用 Set 存所有出现过的商品 ID(保证“存在性”),再用独立对象或 Map 存数量——但这多此一举,不如直接用 Map。仅在特殊场景有用,例如: - 需要快速判断某商品是否“曾被加入过”(不管当前数量),可用 Set 缓存历史 ID; - 主数量管理仍交给 Map,Set 仅作补充索引。
完整小示例(Map 方案)
const cart = new Map(); // id → count
<p>function addItem(id) {
cart.set(id, (cart.get(id) || 0) + 1);
}</p><p>function removeItem(id) {
const count = cart.get(id) || 0;
if (count <= 1) cart.delete(id);
else cart.set(id, count - 1);
}</p><p>function getItemCount(id) {
return cart.get(id) || 0;
}</p><p>// 使用
addItem('apple'); // {apple: 1}
addItem('apple'); // {apple: 2}
addItem('banana'); // {apple: 2, banana: 1}
console.log(getItemCount('apple')); // 2


















