如何将含重复对象的数组转换为指定结构的唯一对象?
问题:合并重复货币对象的累计值计算
我有一个包含重复货币对象的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
相关产品推荐
相关产品推荐

