如何统计数组中按ID区分的对象数量并生成指定格式字符串
解决方案
步骤1:统计每个商品的数量
用Map来统计重复项,遍历数组时,若当前ID已存在则数量加1,不存在则初始化数量为1:
const cart = [ { "id":5, "name": "banana" }, { "id":5, "name": "banana" }, { "id":4, "name": "apple" }, { "id":1, "name": "strawberry" }, { "id":1, "name": "strawberry" } ]; // 统计各商品数量 const countMap = new Map(); cart.forEach(item => { if (countMap.has(item.id)) { countMap.set(item.id, { ...countMap.get(item.id), count: countMap.get(item.id).count + 1 }); } else { countMap.set(item.id, { name: item.name, count: 1 }); } });
步骤2:按ID从高到低排序
将Map的键值对转为数组,再根据ID降序排序:
// 转换为数组并按ID降序排列 const sortedItems = Array.from(countMap.entries()) .sort(([idA], [idB]) => idB - idA);
步骤3:生成目标格式字符串
遍历排序后的数组,拼接成要求的格式,同时处理名称首字母大写:
// 生成最终字符串 const result = sortedItems.map(([_, { name, count }]) => { const formattedName = name.charAt(0).toUpperCase() + name.slice(1); return `${count}x ${formattedName}`; }).join(', '); console.log(result); // 输出:2x Banana, 1x Apple, 2x Strawberry
完整整合代码
const cart = [ { "id":5, "name": "banana" }, { "id":5, "name": "banana" }, { "id":4, "name": "apple" }, { "id":1, "name": "strawberry" }, { "id":1, "name": "strawberry" } ]; const countMap = new Map(); cart.forEach(item => { countMap.has(item.id) ? countMap.set(item.id, { ...countMap.get(item.id), count: countMap.get(item.id).count + 1 }) : countMap.set(item.id, { name: item.name, count: 1 }); }); const result = Array.from(countMap.entries()) .sort(([a], [b]) => b - a) .map(([_, { name, count }]) => `${count}x ${name.charAt(0).toUpperCase() + name.slice(1)}`) .join(', '); console.log(result);
内容的提问来源于stack exchange,提问作者Ladizi
相关产品推荐
相关产品推荐

