如何判断一维对象数组是否包含指定值列表的全部元素?
问题分析
你当前代码的核心问题有3个:
- 逻辑方向错误:你写的逻辑是校验「所有人员的所属大洲都在合法范围内」,但实际需求是校验「人员列表覆盖了全部指定大洲」,二者逻辑完全相反
- 未读取对象属性:list的每一项是存储人员信息的对象,你直接用
list[i]和大洲字符串做匹配,永远不可能匹配成功,需要读取list[i].continent属性做判断 - 入参被覆盖:函数第一行直接给
continents赋了固定值,导致外部传入的参数完全失效,如果你需要默认值可以单独处理,不要直接覆盖入参
修复后的代码
简洁实现(推荐)
用Set去重后判断长度即可,逻辑清晰性能更好:
function containsContinents(list, requiredContinents = ['Africa', 'Americas', 'Asia', 'Europe', 'Oceania']) { // 提取所有出现过的大洲 const existedContinents = new Set(list.map(item => item.continent)) // 校验所有要求的大洲都存在 return requiredContinents.every(continent => existedContinents.has(continent)) }
兼容原for循环写法
如果你习惯用基础for循环实现,也可以改写成如下版本:
function containsContinents(list, continents) { // 需要默认值可以打开下一行注释 // continents = continents || ['Africa', 'Americas', 'Asia', 'Europe', 'Oceania']; // 先记录每个大洲是否出现 const appearMap = {} for (let i = 0; i < list.length; i++) { const continent = list[i].continent appearMap[continent] = true } // 遍历要求的大洲,判断是否全部出现 for (let i = 0; i < continents.length; i++) { if (!appearMap[continents[i]]) { return false } } return true }
用你提供的测试list调用该函数,会返回true,符合预期。
内容的提问来源于stack exchange,提问作者MarcoM
相关产品推荐
相关产品推荐

