如何展开对象数组并将嵌套值转换为键值对?
问题描述
嵌套数组stats由包含键值对的对象组成:
- 每个对象中的
statName对应属性键,statValue对应属性值 - 需要将这些键值对提取出来,合并到最外层对象中,同时移除原有的
stats数组
可用的JavaScript方法
可以借助两个原生方法实现需求:
- Object.fromEntries():将键值对列表转换为对象
- Object.entries():返回给定对象的可枚举字符串键属性的键值对数组(本次需求核心使用fromEntries)
原始数据
[ { "playerName": "Chris Kirk", "country": "United States", "countryFlag": "USA", "rank": 35, "stats": [ { "statName": "Avg", "statValue": "70.356" }, { "statName": "Total Strokes", "statValue": "5,176" }, { "statName": "Total Adjustment", "statValue": "30.308" }, { "statName": "Total Rounds", "statValue": "74" } ] }, { "playerName": "Kevin Yu", "country": "Chinese Taipei", "countryFlag": "TPE", "rank": 36, "stats": [ { "statName": "Avg", "statValue": "70.386" }, { "statName": "Total Strokes", "statValue": "3,251" }, { "statName": "Total Adjustment", "statValue": "57.157" }, { "statName": "Total Rounds", "statValue": "47" } ] } ]
期望结果
[ { "playerName": "Chris Kirk", "country": "United States", "countryFlag": "USA", "rank": 35, "Avg": "70.356", "Total Strokes": "5,176", "Total Adjustment":"30.308", "Total Rounds": "74" }, { "playerName": "Kevin Yu", "country": "Chinese Taipei", "countryFlag": "TPE", "rank": 36, "Avg": "70.386", "Total Strokes": "3,251", "Total Adjustment": "57.157", "Total Rounds": "47" } ]
解决方案
使用Array.map()遍历球员数组,结合Object.fromEntries()将stats转换为键值对对象,再通过对象展开运算符合并属性并剔除stats:
const transformedPlayers = players.map(({ stats, ...rest }) => ({ ...rest, ...Object.fromEntries(stats.map(stat => [stat.statName, stat.statValue])) }));
逻辑说明:
- 用
map()遍历每个球员对象 - 解构赋值分离
stats数组和其余属性(rest) - 把
stats数组转换为[键, 值]格式的数组 - 用
Object.fromEntries()将数组转为键值对对象 - 展开
rest和转换后的对象,得到最终结构
内容的提问来源于stack exchange,提问作者Omar Morrison
相关产品推荐
相关产品推荐

