如何使用Lodash将含嵌套数组的对象数组转换为指定交叉扁平对象数组
使用Lodash实现数组交叉组合的数据转换
实现思路
需求本质是对每个原始对象内的b、c两个数组做全量笛卡尔配对,每一组配对都保留原对象的a字段值,最终把所有配对结果拼接成一维扁平数组。用Lodash的数组遍历、自动扁平化能力,就能省去手动初始化结果数组、手动拼接嵌套循环输出的冗余代码。
核心用到的Lodash方法
_.flatMap:遍历目标数组,将每个元素经回调转换后返回的嵌套数组自动拍平为一维结构,不用手动管理结果数组的拼接逻辑_.map:遍历单个数组,将每个元素快速转换为指定结构的对象
完整实现代码
// Node.js 环境引入方式;浏览器端script标签引入Lodash可直接使用全局_对象 const _ = require('lodash'); // 原始输入数据 const codes = [ {a: 'aa', b: [ 8518 ], c: [ '2146' ]}, {a: 'bb', b: [ 120123 ], c: [ 'D835', 'DD3B' ]}, {a: 'cc', b: [ 168, 532 ], c: [ '00A8' ] } ] // 转换逻辑 const result = _.flatMap(codes, (originItem) => { // 遍历当前原始对象的b数组所有元素 return _.flatMap(originItem.b, (bValue) => { // 遍历当前原始对象的c数组所有元素,生成交叉配对对象 return _.map(originItem.c, (cValue) => ({ a: originItem.a, b: bValue, c: cValue })) }) })
结果验证
运行上述代码生成的result数组,和题目给出的目标结构完全匹配:
[ {a: 'aa', b:8518, c:'2146'}, {a: 'bb', b:120123, c:'D835'}, {a: 'bb', b:120123, c:'DD3B'}, {a: 'cc', b:168, c:'00A8'}, {a: 'cc', b:532, c:'00A8'} ]
扩展提示
如果后续需要支持更多待交叉的数组字段(比如新增d数组需要和b、c做全量配对),只需要在嵌套的flatMap层级中追加对应数组的遍历逻辑即可,整体代码结构不需要调整。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

