
本文介绍两种简洁高效的方法,用于判断由键值对对象组成的数组中,是否存在某个数值(如天气代码),核心思路是提取所有嵌套数组并进行扁平化搜索。
在实际开发中,我们常遇到类似结构的数据:一个对象数组,每个对象仅含一个键(如 sunny、cloudy),其值为数字数组。此时若需快速判断某数值(如 theCode = 1003)是否存在于任意子数组中,直接遍历嵌套结构既冗长又易出错。以下是两种推荐方案:
✅ 方案一:使用 some() + Object.values() + flat()(推荐)
该方法语义清晰、性能良好,一行逻辑即可完成判断:
function weatherCodes() {
const codes = [{ sunny: [1001] }, { cloudy: [1002, 1003] }];
const theCode = 1003;
return codes.some(obj => Object.values(obj).flat().includes(theCode));
}
console.log(weatherCodes()); // true✅ 优点:
- some() 短路执行——一旦找到匹配即返回 true,无需遍历全部;
- Object.values(obj) 提取对象所有值(此处恒为单个数组);
- flat() 处理单层嵌套,兼容后续可能的多维扩展(如 [[1001]]);
- 代码可读性强,符合函数式编程习惯。
✅ 方案二:预提取 + includes()(适合复用场景)
若需多次查询不同 theCode,或需获取所有可用代码列表,可先统一提取所有值:
function weatherCodes() {
const codes = [{ sunny: [1001] }, { cloudy: [1002, 1003] }];
const theCode = 1003;
const allValues = codes.flatMap(obj => Object.values(obj)).flat();
return allValues.includes(theCode);
}
console.log(weatherCodes()); // true⚠️ 注意:flatMap() 相当于 map().flat(1),此处与 flat() 组合可安全处理任意数量的对象和单层数组值。
? 补充说明与健壮性建议
- 若对象可能含多个键(如 { sunny: [1001], partlyCloudy: [1004] }),上述方法依然适用,因 Object.values() 会返回所有值组成的数组(如 [[1001], [1004]]),再经 flat() 合并为 [1001, 1004];
- 若存在 null/undefined 值,建议增加防护:Object.values(obj).filter(Array.isArray).flat();
- ES5 兼容需求下,可用 reduce() 替代 flatMap,但现代项目推荐使用上述原生 API。
综上,优先选用方案一(some + flat),兼顾性能、可读性与扩展性。










