如何提取嵌套JavaScript对象中的所有name值并返回一维数组?
提取嵌套对象中所有name值为一维数组的解决方案
嘿,我来帮你搞定这个问题!你当前的代码返回嵌套数组,核心原因是递归调用toArray(value)得到子数组后,你直接用push把整个子数组塞进结果里了,导致数组一层套一层。咱们只需要调整递归时的数组合并方式,再加上精准的属性判断,就能得到想要的一维数组。
方法一:修改原递归函数
直接调整你现有的toArray函数,做两个关键改动:
- 递归处理子对象时,用展开运算符
...把递归返回的子数组元素展开后添加到结果,避免嵌套; - 只提取
name属性的值,确保不会混入其他属性内容(更严谨)。
修改后的代码如下:
function toArray(obj) { const result = []; for (const prop in obj) { const value = obj[prop]; // 注意要排除null,因为typeof null也会返回'object' if (typeof value === 'object' && value !== null) { // 展开递归得到的数组,把元素逐个push进去 result.push(...toArray(value)); } else if (prop === 'name') { result.push(value); } } return result; } function nameMatrioska(target) { return toArray(target); }
方法二:针对固定结构的简化写法
如果你的对象结构固定(每个节点只有name和daughter属性),可以写更直观的递归函数:
function nameMatrioska(obj) { const names = []; // 先把当前节点的name加进去 if (obj.name) { names.push(obj.name); } // 如果有子节点daughter,递归处理并合并结果 if (obj.daughter && typeof obj.daughter === 'object') { names.push(...nameMatrioska(obj.daughter)); } return names; }
测试验证
用你提供的嵌套对象测试:
const family = { name: 'grandma', daughter: { name: 'mother', daughter: { name: 'daughter', daughter: { name: 'granddaughter' } } } }; console.log(nameMatrioska(family)); // 输出:['grandma', 'mother', 'daughter', 'granddaughter']
这样就能完美得到你想要的一维数组啦!
内容的提问来源于stack exchange,提问作者Joao Moreira
相关产品推荐
相关产品推荐

