如何将JS对象数组的所有键合并为单个数组并去重排除name键
报错原因
- 遍历逻辑错误:
data数组的每一项都是普通对象,你代码里写的cur[0]会拿到undefined,调用Object.keys(undefined)就会触发TypeError: Cannot convert undefined or null to object报错。 - reduce返回值类型不匹配:你给reduce设置的初始值是空数组,但遍历过程中返回的是
{ names }对象,类型不一致导致后续遍历逻辑完全失效。 - 过滤逻辑不可靠:使用
keys.splice(1)删除第一个键的逻辑依赖name是对象的第一个键,一旦对象键顺序变化就会出现误删。
正确实现
极简写法(ES2019+支持)
使用flatMap+Set组合实现,代码简洁易读:
const result = [...new Set(data.flatMap(item => Object.keys(item).filter(key => key !== 'name') ))]
逻辑说明:
flatMap遍历每个对象,返回当前对象过滤掉name后的键数组,自动把所有数组合并为一维数组- 利用
Set结构自动去除重复键 - 用扩展运算符把
Set转为普通数组,得到最终结果
兼容写法(全ES版本支持)
使用reduce实现,兼容性更好:
const result = data.reduce((acc, cur) => { Object.keys(cur).forEach(key => { if (key !== 'name' && !acc.includes(key)) { acc.push(key) } }) return acc }, [])
逻辑说明:
- reduce初始值设为空数组,用来存储最终的键列表
- 遍历每个对象的所有键,过滤掉
name且未在结果数组中出现过的键,推入结果数组 - 遍历完成后直接拿到符合要求的结果
内容的提问来源于stack exchange,提问作者Tyler Morales
相关产品推荐
相关产品推荐

