You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS如何遍历未知结构数组查找任意位置对象内的指定属性

实现思路

不用提前预知数组结构,写递归遍历逻辑即可:遍历数组每一项时,跳过字符串、数字这类基础类型;遇到数组/普通对象就递归深入遍历,匹配到目标属性就返回对应值,不管目标属性藏在数组哪个位置、嵌套多少层都能找到。

可直接复用的代码
function findNestedKey(targetArr, targetKey) {
  for (const item of targetArr) {
    // 跳过null、基础类型,这类值不可能挂载属性
    if (typeof item !== 'object' || item === null) continue;

    // 遇到嵌套数组,递归深入查找
    if (Array.isArray(item)) {
      const res = findNestedKey(item, targetKey);
      if (res !== undefined) return res;
      continue;
    }

    // 普通对象先判断是否直接存在目标属性
    if (Object.hasOwn(item, targetKey)) {
      return item[targetKey];
    }

    // 对象本身没目标属性的话,遍历对象所有属性值,找嵌套的对象/数组继续查
    for (const val of Object.values(item)) {
      if (typeof val === 'object' && val !== null) {
        const res = Array.isArray(val) 
          ? findNestedKey(val, targetKey)
          : findNestedKey([val], targetKey);
        if (res !== undefined) return res;
      }
    }
  }
  // 全量遍历没找到返回undefined
  return undefined;
}
示例验证

针对给出的两个测试数组,调用方法即可拿到对应token值:

const args1 = ['string', 5, 3, { value: 'value', number: 2, token: 'token' }];
const args2 = [
  'string',
  { token: 'token', name: 'name' },
  1,
  3,
  2,
  { book: 'book' },
];

console.log(findNestedKey(args1, 'token')); // 输出: token
console.log(findNestedKey(args2, 'token')); // 输出: token
补充说明
  • 上述逻辑默认返回第一个匹配到的属性值,如果数组里存在多个同名目标属性,需要收集所有匹配结果的话,把提前return的逻辑改成往结果数组追加值,遍历完成后返回结果数组即可。
  • 代码里用Object.hasOwn做属性判断,只会匹配对象自身的属性,不会把原型链上继承来的同名属性误判为匹配结果。
  • 逻辑支持任意深度的嵌套场景,不管是数组套对象、对象套数组、对象套对象的结构都能正常遍历,不需要提前知晓数据结构。
  • 如果需要兼容ES2022之前的老旧运行环境,把代码里的Object.hasOwn(item, targetKey)替换为Object.prototype.hasOwnProperty.call(item, targetKey)即可。

内容的提问来源于stack exchange,提问作者BitByte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:18:16