Lodash pick方法在ES6与require导入下的行为差异原因咨询
为什么lodash/fp的pick和普通lodash的pick表现不一致?
这是因为lodash/fp(函数式版本)的API和普通lodash的API在参数顺序与调用逻辑上有本质区别,核心原因是lodash/fp专为函数式编程场景设计,做了两个关键调整:
1. 参数顺序完全倒置
普通lodash的_.pick遵循「先数据,后配置」的参数逻辑:
_.pick(object, paths)
第一个参数是要操作的目标对象,第二个是要提取的属性路径数组。
但lodash/fp的pick反过来了,采用「先配置,后数据」的顺序:
pick(paths, object)
你之前的调用pick(obj, ['a', 'c'])相当于把obj(对象)传给了「路径数组」的参数位,把['a','c']传给了「目标对象」的参数位——因为obj不是有效的路径数组,自然提取不到任何属性,所以返回空对象{}。
2. 自动柯里化特性
lodash/fp的所有函数都默认柯里化,意味着你可以分步传递参数:
// 先传入路径,得到一个等待接收对象的函数 const pickAC = pick(['a', 'c']); // 再传入对象,得到最终结果 const result = pickAC(obj); console.log(result); // => { 'a': 1, 'c': 3 }
当然你也可以一次性传全参数,只要保证顺序正确:
const result = pick(['a', 'c'], obj); console.log(result); // => { 'a': 1, 'c': 3 }
这种设计的意义是什么?
「先配置后数据」+ 柯里化,是为了更好地支持函数式编程中的**管道(pipe)、组合(compose)**操作,让链式逻辑更流畅:
import { pipe, pick, map } from 'lodash/fp'; // 串联多个操作:先提取属性,再对属性值做乘法 const processData = pipe( pick(['a', 'c']), map(val => val * 2) ); const obj = { 'a': 1, 'b': '2', 'c': 3 }; console.log(processData(obj)); // => { 'a': 2, 'c': 6 }
如果用普通lodash,这种链式操作会需要额外处理参数顺序,代码会繁琐很多。
而你用require('lodash')导入的是普通版本的lodash,它的_.pick遵循传统的「先数据后配置」逻辑,所以你的调用_.pick(object, ['a', 'c'])完全符合预期,得到了正确结果。
内容的提问来源于stack exchange,提问作者Cristian Muscalu
相关产品推荐
相关产品推荐

