You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含重复对象的数组转换为指定结构的唯一对象?

问题:合并重复货币对象的累计值计算

我有一个包含重复货币对象的JavaScript数组,需要将其转换为以货币名称为键、包含sold和bought累计值的对象结构。但用reduce实现的函数返回结果不正确,不知道如何正确累加已有项与新项的值。

输入数组

const data = [
  {
    name: "USD",
    value: 200,
    type: "sell"
  },
  {
    name: "USD",
    value: 50,
    type: "buy"
  },
  {
    name: "EUR",
    value: 150,
    type: "buy"
  },
  {
    name: "USD",
    value: 200,
    type: "sell"
  }
];

期望输出

{
  USD: {
    sold: 400,
    bought: 50
  },
  EUR: {
    sold: 0,
    bought: 150
  }
}

当前代码的问题

你当前实现的错误在于else分支:每次更新时都重新赋值了整个货币对象,并且将非当前type的属性直接设为0,导致之前累计的值被覆盖。比如处理USD的buy项时,sold被重置为0,丢掉了之前的200;处理第二次sell项时,bought又被重置为0,覆盖了之前的50。

正确实现方法

方法一:清晰直观版

const data = [
  { name: "USD", value: 200, type: "sell" },
  { name: "USD", value: 50, type: "buy" },
  { name: "EUR", value: 150, type: "buy" },
  { name: "USD", value: 200, type: "sell" }
];

const convert = (data) => {
  return data.reduce((acc, item) => {
    // 若累加器中无当前货币,初始化sold和bought为0
    const stats = acc[item.name] || { sold: 0, bought: 0 };
    // 根据type累加对应数值
    if (item.type === "sell") {
      stats.sold += item.value;
    } else if (item.type === "buy") {
      stats.bought += item.value;
    }
    // 将更新后的统计对象放回累加器
    acc[item.name] = stats;
    return acc;
  }, {});
};

console.log(convert(data));

方法二:简洁解构版

const convert = (data) => {
  return data.reduce((acc, { name, value, type }) => {
    // 初始化或获取已有统计对象
    acc[name] = acc[name] || { sold: 0, bought: 0 };
    // 根据type直接累加对应属性
    acc[name][type === "sell" ? "sold" : "bought"] += value;
    return acc;
  }, {});
};

这两种实现的核心逻辑一致:每次迭代时先确保累加器中存在当前货币的统计对象(不存在则初始化),然后仅更新对应type的数值,保留另一个属性的累计值,避免覆盖。

内容的提问来源于stack exchange,提问作者NoName

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:10:39