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

如何过滤对象数组并合并为单个对象?特定场景实现及代码修正

解决方法:用reduce替代map构建目标对象

你的思路方向是对的——先过滤出topic为favorites的条目,但问题出在后续的转换步骤:map会返回数组,而你需要的是单个键值对对象,而且你的map语法也存在错误。

正确实现代码

const events = [ 
  { topic: 'favorites', receiver: '1000066928', datetime: new Date('2016-11-26T21:43:54.000Z') }, 
  { topic: 'favorites', receiver: '1000061499', datetime: new Date('2017-01-03T19:15:04.000Z') }, 
  { topic: 'blocked', receiver: '1000102733', datetime: new Date('2017-01-05T17:04:15.000Z') }, 
  { topic: 'blocked', receiver: '1000107928', datetime: new Date('2017-01-06T17:17:05.000Z') } 
];

const favoritesMap = events
  // 第一步:过滤出topic为favorites的条目
  .filter(event => event.topic === 'favorites')
  // 第二步:用reduce累积成目标对象
  .reduce((accumulator, { receiver, datetime }) => {
    // 将receiver作为键,datetime转成ISO字符串(和目标示例格式匹配,需Date对象可直接赋值)
    accumulator[receiver] = datetime.toISOString();
    return accumulator;
  }, {}); // 初始值设为空对象

console.log(favoritesMap);

代码解释

  1. filter步骤:保留所有topic等于favorites的条目,这部分你之前的写法是正确的。
  2. reduce步骤:
    • 第一个参数是累积函数,accumulator是我们要构建的目标对象,每次迭代都会更新它。
    • 用对象解构直接取出receiver和datetime,简化代码逻辑。
    • 把receiver作为键,datetime转成ISO格式字符串(和你的目标示例格式一致),添加到accumulator中。
    • 最后返回更新后的accumulator,初始值设为空对象{}。

运行结果

{
  "1000066928": "2016-11-26T21:43:54.000Z",
  "1000061499": "2017-01-03T19:15:04.000Z"
}

原代码的问题说明

  • 语法错误:你写的map(receiver, datetime => receiver: datetime)不符合箭头函数语法,正确写法应该是接收单个event参数,比如map(event => ({ [event.receiver]: event.datetime })),但这样会返回一个包含多个单键对象的数组,不是你需要的单个对象。
  • 返回值类型不符:map的返回值是数组,而你需要的是单个聚合对象,reduce是处理这种“从数组生成单个聚合值”场景的最佳工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:27:46