You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:09