JavaScript如何通过map方法将对象数组转为type为键、count为值的对象
问题根源
你多次调整写法仍得不到预期结果,核心是两点偏差:
- 方法选型错配:
map的设计目标是对原数组每一项做映射,最终返回和原数组长度完全相等的新数组。哪怕你补全map里的return逻辑,最终输出也会是单键对象组成的数组(形如[{adults:2}, {children:3}, {infants:3}]),和你要的单扁平对象目标完全不符。 - 动态对象键写法遗漏:你卡在return部分的写法,本质是没掌握JS计算属性语法:如果要把变量的值作为对象的键名,必须把动态变量包在方括号内,即
{ [type]: count };如果直接写{ type: count },只会生成固定键名type的对象,完全拿不到预期的动态键效果。
正确实现方案
方案1:最优解(reduce实现)
reduce专门用于数组迭代后把结果聚合为单个值,完全适配数组转对象的场景:
this.passengerSelectedCounts = this.passengerList.reduce((acc, { type, count }) => { // 将当前项的type作为键、count作为值,写入累加容器 acc[type] = count; return acc; }, {}); // 迭代初始值设为空对象,作为最终结果的容器
方案2:传统for循环实现
如果你更习惯之前尝试过的for循环写法,逻辑和reduce完全一致,只是手动完成遍历:
// 初始化空对象承载最终结果 const countMap = {}; for (const item of this.passengerList) { countMap[item.type] = item.count; } this.passengerSelectedCounts = countMap;
不推荐:硬套现有map代码的冗余写法
如果你非要基于当前写的map片段调整,必须在map外层增加一步对象合并操作,属于绕远的冗余实现,不建议日常开发使用:
// map的return部分需要使用计算属性语法 this.passengerSelectedCounts = Object.assign( {}, ...this.passengerList.map(({type, count}) => ({ [type]: count })) );
内容的提问来源于stack exchange,提问作者user11083200
相关产品推荐
相关产品推荐

