如何合并数组中同类型香蕉元素并求和价格生成目标数组
如何合并数组中同类型香蕉元素并求和价格生成目标数组
嘿,我来帮你搞定这个问题!你的需求是把数组里带banana_前缀的元素合并成一个banana项,把它们的价格加总,同时保留其他非香蕉元素,最终生成arr2对吧?你的尝试思路方向没错,但还没处理好求和和合并的核心逻辑,我给你两个实用的解决方案:
方法一:用reduce分组累加(推荐,简洁高效)
reduce是处理这类分组求和场景的绝佳工具,它可以遍历数组并逐步构建我们需要的结果:
const arr = [ { item: 'banana_3', price: 100 }, { item: 'banana_2', price: 200 }, { item: 'apple', price: 500 } ]; // 用reduce构建分组对象,再转成数组 const arr2 = Object.values(arr.reduce((acc, currentItem) => { // 统一香蕉类元素的键为'banana',其他元素用原item值 const key = currentItem.item.includes('banana') ? 'banana' : currentItem.item; if (acc[key]) { // 如果该类型已存在,累加价格 acc[key].price += currentItem.price; } else { // 如果不存在,新建一个项(复制对象避免修改原数据) acc[key] = { item: key, price: currentItem.price }; } return acc; }, {})); console.log(arr2); // 输出:[{ item: 'banana', price: 300 }, { item: 'apple', price: 500 }]
代码说明:
- 我们用一个空对象作为
reduce的初始值,用来临时存储分组后的结果(键是元素类型,值是对应的对象)。 - 遍历每个元素时,判断是否是香蕉类元素,是的话统一用
banana作为键。 - 如果键已经存在,就把当前元素的价格加到已有的价格上;不存在的话就新建一个对应的对象。
- 最后用
Object.values()把分组对象转成数组,就是我们要的arr2啦。
方法二:分步处理(更直观,适合新手理解)
如果你觉得reduce有点绕,可以拆成几个步骤来做,逻辑更清晰:
const arr = [ { item: 'banana_3', price: 100 }, { item: 'banana_2', price: 200 }, { item: 'apple', price: 500 } ]; // 第一步:筛选所有香蕉元素并求和 const bananaTotalPrice = arr .filter(item => item.item.includes('banana')) .reduce((total, item) => total + item.price, 0); // 第二步:筛选出所有非香蕉元素 const nonBananaItems = arr.filter(item => !item.item.includes('banana')); // 第三步:合并非香蕉元素和求和后的香蕉项 const arr2 = [...nonBananaItems, { item: 'banana', price: bananaTotalPrice }]; console.log(arr2); // 输出和上面一样的结果
代码说明:
- 先通过
filter把所有香蕉元素挑出来,再用reduce计算它们的总价格。 - 再用
filter把非香蕉元素筛选出来。 - 最后用扩展运算符
...把非香蕉元素和新的香蕉项合并成新数组。
对你原代码的小建议
你原来的循环里直接给arr[i].price赋值为arr[i+1].price,这样只会覆盖价格,既没有累加,也没有删除多余的香蕉元素,所以达不到合并的效果。上面的两种方法都能完美解决你的需求,而且默认不会修改原数组(保持数据不可变是前端开发的好习惯哦)。
备注:内容来源于stack exchange,提问作者sora




