使用Lodash遍历对象并将子对象转换为数组追加的最优方案
使用Lodash深度遍历对象并转换子对象为数组的最优方案
嘿,针对你提出的需求——深度遍历对象,把所有遇到的子对象转成数组并追加到结果里,我整理了一个基于Lodash的高效实现方案,完全适配你给出的测试对象结构:
核心思路
我采用了递归+Lodash工具方法的组合,核心逻辑很清晰:
- 遍历对象的每一个属性值,用
_.isPlainObject判断是不是纯JS对象 - 一旦确认是子对象,就用
_.toArray把它转成数组,直接把元素追加到结果数组里 - 递归处理每个子对象的嵌套属性,确保哪怕是深层嵌套的对象也不会被漏掉
完整代码实现
const _ = require('lodash'); const flattenNestedObjects = (obj) => { let result = []; // 遍历当前对象的所有属性值 _.forEach(obj, (value) => { if (_.isPlainObject(value)) { // 把当前子对象转成数组,直接追加元素到结果 result.push(..._.toArray(value)); // 递归处理子对象里的嵌套内容 result.push(...flattenNestedObjects(value)); } }); return result; }; // 补全你提供的测试对象 let testObj = { 'name': 'testdata', 'active': false, 'nestedData': { 0: { 0: { 'name': '1', 'value': 1 }, 1: { 'name': '2', 'value': 1 }, 2: { 'name': '3', 'value': 1 }, 3: { 'name': '4', 'value': 1 }, }, 1: { 0: { 'name': '5', 'value': 1 }, 1: { 'name': '6', 'value': 1 }, 2: { 'name': '7', 'value': 1 }, 3: { 'name': '8', 'value': 1 } } } }; // 执行函数查看结果 const finalResult = flattenNestedObjects(testObj); console.log(finalResult);
代码细节说明
_.isPlainObject:这个方法能帮我们精准识别普通JS对象,避免误处理数组、DOM元素或者其他特殊对象_.toArray:对于你测试对象里那种以数字为键的类数组对象,它会按顺序把属性值转成数组,完美符合你的需求- 递归遍历:不管你的对象嵌套多少层(比如
testObj.nestedData.0.0这种深层结构),都能被处理到 - 扩展运算符
push(...):直接把数组元素追加到结果里,省去了额外的数组合并步骤,效率更高
可选优化:只处理类数组对象
如果你的需求里,只需要转换键为连续数字的类数组对象(而不是所有子对象),可以加个判断函数过滤一下:
// 判断是否为键连续的类数组对象 const isArrayLikeObject = (obj) => { const keys = _.keys(obj); return keys.every((key, idx) => Number(key) === idx); }; // 修改forEach里的判断逻辑 if (_.isPlainObject(value) && isArrayLikeObject(value)) { result.push(..._.toArray(value)); result.push(...flattenNestedObjects(value)); }
这样就能只处理像testObj.nestedData.0这种结构的对象,而不会处理testObj本身或者testObj.nestedData这类普通对象。
内容的提问来源于stack exchange,提问作者Thibs
相关产品推荐
相关产品推荐

