You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何合并数组中同类型香蕉元素并求和价格生成目标数组

如何合并数组中同类型香蕉元素并求和价格生成目标数组

嘿,我来帮你搞定这个问题!你的需求是把数组里带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

火山引擎 最新活动