如何使用Map检查嵌套对象数组中指定键(如channel)是否存在
多对象数组的全量channel键检查实现
现有代码的问题
你现在的代码硬编码了obj[0]的访问路径,只能检查数组第一个元素的键存在情况,多对象场景下会完全漏检后续元素,同时如果碰到某个元素没有Movies属性的情况,直接顺着路径读属性还会触发运行时报错。
实现方案
按照需求,只要数组里任意一个位置的Movies节点下缺channel键,就算检查不通过,这种全量校验直接用数组原生的every方法最省心——它的语义就是只有数组所有元素都满足断言条件时才返回true,不管数组是1个元素还是上百个元素,都会自动遍历完成检查,不需要手动写循环、维护下标,也不会出现硬编码下标漏检的问题。
可直接替换的代码
兼容所有JS运行环境的稳妥写法:
// 全量遍历检查所有元素的channel键存在性 const isAllChannelExist = obj.every(item => { // 先判断Movies属性存在,再读取channel,避免属性层级缺失时报错 return item.Movies && typeof item.Movies.channel !== 'undefined'; }); // 原有判断逻辑保持不变 if (isAllChannelExist) { console.log('exists'); } else { console.log('does not exist'); }
支持ES2020及以上环境的简化写法:
// 用可选链简化逐层属性判断 const isAllChannelExist = obj.every(item => typeof item?.Movies?.channel !== 'undefined'); if (isAllChannelExist) { console.log('exists'); } else { console.log('does not exist'); }
注意事项
- 如果你的校验需求反过来,只要数组里有任意一个元素存在
channel键就算通过,把every替换为some方法即可 - 空数组场景下
every方法会默认返回true,如需对空数组做特殊判定,增加obj.length > 0的前置校验 - 兼容低版本IE的场景不要使用可选链写法,优先选择基础兼容的实现版本
内容的提问来源于stack exchange,提问作者WSB
相关产品推荐
相关产品推荐

