
本文介绍在多层嵌套数组对象结构中,通过 id 快速判断某项是否存在的几种简洁、可复用的实现方式,包括原生 javascript 的函数封装和 lodash 的语义化写法。
本文介绍在多层嵌套数组对象结构中,通过 id 快速判断某项是否存在的几种简洁、可复用的实现方式,包括原生 javascript 的函数封装和 lodash 的语义化写法。
在实际开发中,我们常需在嵌套数据结构(如数组内含对象,对象又包含子数组)中查找特定元素。例如,给定一个 sites 数组,每个站点对象包含一个 list 子数组,而我们要判断某个具有特定 id 的条目是否已存在其中。虽然直接链式调用 .some()(如 sites.some(...).list.some(...))逻辑清晰且可行,但重复书写嵌套条件易导致代码冗余、可读性下降,也不利于复用与维护。
✅ 推荐做法:封装为可复用函数
将嵌套查询逻辑提取为独立函数,既提升可读性,又符合 DRY(Don’t Repeat Yourself)原则:
function isItemPresent(sites, item) {
return sites.some(site => site.list?.some(subItem => subItem.id === item.id));
}
注意:这里添加了可选链操作符 ?.(ES2020+),用于安全访问 site.list,避免因某 site 缺失 list 字段而抛出运行时错误。
使用示例:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
const sites = [{
"name": "name1",
"list": [{
"id": 1,
"name": "Year",
"type": "int"
}]
}];
const item1 = { "id": 1, "name": "Year", "type": "int" };
const item2 = { "id": 2, "name": "Month", "type": "int" };
console.log(isItemPresent(sites, item1)); // true
console.log(isItemPresent(sites, item2)); // false
? 进阶方案:借助 Lodash 提升表达力
若项目已引入 Lodash,可利用其 _.some 的属性匹配语法,使意图更直观:
import _ from 'lodash';
function isItemPresent(sites, item) {
return _.some(sites, site => _.some(site.list, { id: item.id }));
}
该写法等价于“查找任意 site,其 list 中存在一个对象,该对象的 id 属性严格等于 item.id”,语义更贴近自然语言,且自动处理空值边界(如 site.list 为 undefined 或 null 时不会报错)。
⚠️ 注意事项
- 若需深度全等比较(不仅比 id,还要校验所有字段),应改用 _.isEqual 或自定义深比较逻辑,而非仅依赖 id;
- 频繁查询场景下(如大型列表 + 高频调用),建议预先构建 id → item 的 Map 索引,将时间复杂度从 O(n×m) 优化至 O(1);
- 始终考虑 null/undefined 边界情况,生产环境推荐使用可选链(?.)或 Lodash 的健壮工具函数。
综上,.some 嵌套本身并无性能或语义缺陷,关键在于合理封装与工程化抽象——让代码既准确表达意图,又便于测试、复用与长期演进。










