如何过滤对象数组并合并为单个对象?特定场景实现及代码修正
解决方法:用
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);
代码解释
filter步骤:保留所有topic等于favorites的条目,这部分你之前的写法是正确的。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
相关产品推荐
相关产品推荐

