递归搜索嵌套对象数组并按指定键构造新数组的实现问题
解决嵌套对象数组的指定键值提取问题
原代码的问题
你之前用JSON.stringify的思路不对,而且代码里有明显错误:
nestedValue[a]里的a是未定义变量,应该是当前遍历的目标键- 逻辑上循环每个目标键时,重复把同一个
foundObj推到数组里,导致结果重复且错误 - 没有单独处理每个用户,而是直接操作整个
response对象
正确实现方案
我们需要递归遍历每个用户的所有嵌套属性(包括对象和数组),收集指定键的键值对,最终生成符合要求的新数组。代码如下:
// 递归收集单个对象/数组中指定键的键值对 function collectKeys(target, keys) { const result = {}; function traverse(item) { if (typeof item !== 'object' || item === null) return; // 处理数组(比如work数组) if (Array.isArray(item)) { item.forEach(traverse); return; } // 处理对象 Object.entries(item).forEach(([key, value]) => { // 如果当前键是目标键,就存入结果 if (keys.includes(key)) { result[key] = value; } // 递归遍历嵌套对象 traverse(value); }); } traverse(target); return result; } // 主函数:处理用户数组 function dynamic(obj, ...keyToFind) { // 取出users数组,遍历每个用户收集指定键 return obj.users.map(user => collectKeys(user, keyToFind)); }
调用示例
const result = dynamic(response, 'age', 'work', 'main', 'description', 'type', 'date'); console.log(result);
输出结果
会得到你期望的数组:
[ { 'age': 33, 'work': 1015, 'main': 'Doctor', 'description': 'Ofto', 'type': 0.26, 'date': '2022-08-30 15:00:00' }, { 'age': 25, 'work': 101, 'main': 'Software', 'description': 'Programmer', 'type': 5.6, 'date': '2021-01-30 12:00:00' }, { 'age': 75, 'work': 1, 'main': 'Pension', 'description': 'Architect', 'type': 1.6, 'date': '2020-01-30 12:00:00' } ]
逻辑说明
collectKeys函数负责递归遍历单个用户的所有属性:遇到数组就遍历数组元素,遇到对象就遍历键值对,匹配到目标键就把值存入结果对象- 主函数
dynamic取出response里的users数组,用map遍历每个用户,调用collectKeys生成每个用户的精简对象,最终组成新数组
内容的提问来源于stack exchange,提问作者Bozhinovski
相关产品推荐
相关产品推荐

