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
相关产品推荐
相关产品推荐

