JavaScript如何在对象数组中按键查找匹配的目标值
问题说明
给定对象数组与目标raceId:
const raceId = '1004' const array = [ { '1004': { brackets: { '18': [Object], '19': [Object], '20': [Object] } } }, { '999': { brackets: { '1': [Object], '2': [Object], '3': [Object] } } } ]
需要提取raceId匹配'1004'的对象值,预期输出:
{ brackets: { '18': [Object], '19': [Object], '20': [Object] } }
要求不使用forEach或for循环,用一行代码实现。
原有reduce写法的错误点
你的reduce代码存在两个核心问题:
- reduce回调要求每次迭代必须返回累加值,你的逻辑仅在匹配到目标key时返回值,未匹配的分支没有返回内容,默认返回
undefined,导致后续迭代无法拿到有效累加值,最终结果为undefined - 代码中引用的数组名
raceScoringConfigGroups和你定义的数组变量名array不一致,如果不是笔误会直接触发引用错误
最优一行实现
直接用find搭配可选链实现,找到匹配项后会立刻终止遍历,性能优于全量遍历的reduce/map方案:
const target = array.find(item => Object.hasOwn(item, raceId))?.[raceId]
补充:如果你的运行环境不支持
Object.hasOwn,可以简化判断为item => item[raceId],只要raceId对应的value不会是假值(null/undefined/0/空字符串等)就完全可用。
如果一定要用reduce实现,修正后的写法如下(不推荐,会遍历整个数组,无提前终止逻辑):
const target = array.reduce((res, item) => res ?? (item[raceId] || res), undefined)
内容的提问来源于stack exchange,提问作者Ambulance lada
相关产品推荐
相关产品推荐

