如何使用Lodash以纯函数式方式扁平化两层映射提取二级键
纯函数式实现Lodash对象扁平化
给定原始嵌套结构:
const original = { 'a' : { 'aa' : { b: 1, c: 2}}, 'b' : { 'bb' : { c: 3, d: 4}}, 'c' : { 'cc' : { c: 3, d: 4}} };
要转换为目标扁平结构,这里提供几种无副作用的纯函数式实现:
方法1:_.reduce + _.assign
利用reduce遍历原始对象的所有值,通过assign将每个子对象合并到新的累加器中:
const flattened = _.reduce(original, (acc, currentObj) => { return _.assign({}, acc, currentObj); }, {});
每次返回全新对象而非修改原累加器,完全符合纯函数无副作用的特性。
方法2:_.flatMap + _.fromPairs
先将每个子对象转换为键值对数组,再通过fromPairs组装成目标对象:
const flattened = _.fromPairs( _.flatMap(original, obj => Object.entries(obj)) );
flatMap将所有子对象的键值对展开为一维数组,fromPairs再把数组还原为对象结构,逻辑清晰且无外部状态修改。
方法3:_.transform
transform是Lodash专为对象/数组转换设计的工具,属于更简洁的reduce变种:
const flattened = _.transform(original, (acc, currentObj) => { _.assign(acc, currentObj); }, {});
写法紧凑,所有状态变化都局限在转换过程内部,不会产生副作用。
以上三种方法都规避了原实现中修改外部变量的副作用,遵循纯函数式编程原则,同时代码更简洁易读。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

