如何高效检查对象数组中是否包含指定数值

本文介绍两种简洁高效的方法,用于判断由键值对对象组成的数组中,是否存在某个数值(如天气代码),核心思路是提取所有嵌套数组并进行扁平化搜索。

在实际开发中,我们常遇到类似结构的数据:一个对象数组,每个对象仅含一个键(如 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),兼顾性能、可读性与扩展性。