JavaScript:如何从对象数组提取status嵌套数组的去重值
代码修正方案
你之前的代码存在两个核心问题,导致结果不符合预期:
- 字段名笔误:数据对象中存储状态的字段为
status,原代码解构时写的是不存在的deviceTags字段;即使修正为正确的字段名,也依然会得到错误结果 - 去重逻辑错位、缺少数组拍平步骤:仅通过map遍历拿到每个元素对应的status子数组,未将所有子数组合并为一维数组就直接传入Set去重。由于数组是引用类型,Set只会判断数组引用的唯一性,不会对比数组内部的字符串值,因此既无法合并嵌套结构,也无法对内容相同的状态做去重,最终就会得到你贴出的全量嵌套数组结果。
可直接使用的正确实现
简洁写法(支持现代浏览器/Node.js 11+环境)
直接使用flatMap方法替代map,自动完成一层数组拍平,再做值层面的去重:
const uniqueStatus = [...new Set(data.flatMap(({ status }) => status))]
代码执行逻辑:
flatMap遍历每一个数据项,取出对应status数组,自动将所有分散的子数组合并为包含全量状态值的一维数组- 将合并后的一维数组传入
Set,对数组内的字符串值做去重 - 通过展开运算符将Set转回普通数组,最终得到无重复的一维状态集合
针对你给出的样本数据,上述代码运行后会直接输出目标结果:['online', 'idle', 'network-error', 'offline', 'inoperative']
低版本环境兼容写法
如果需要适配不支持flatMap的老旧运行环境,可以用reduce手动完成数组拼接:
const uniqueStatus = [...new Set( data.reduce((allStatus, currentItem) => allStatus.concat(currentItem.status), []) )]
内容的提问来源于stack exchange,提问作者Hayrettin Basaraner
相关产品推荐
相关产品推荐

