为何Lodash的map方法在隐式链式调用中无法正常工作?
Lodash隐式链式调用与显式链式调用的差异问题
问题重现
给定对象:
let obj = { mytest: [{ mytest2: 123 }] }
尝试使用Lodash隐式链式调用:
_(obj).get('mytest').map('mytest2').value();
执行后抛出错误:
VM922:1 Uncaught TypeError: mytest2 is not a function at Array.map (<anonymous>) at <anonymous>:1:22 (anonymous) @ VM922:1
而使用显式链式调用则正常输出结果:
_.chain(obj).get('mytest').map('mytest2').value(); // 输出: [123]
疑问:为什么两种链式调用的结果不同?使用的是Lodash 4.17.15版本。
原因解释
- 隐式链式调用(
_(obj))的特性:当调用get('mytest')时,方法返回的是原始JS数组[{ mytest2: 123 }],而非Lodash包装对象。此时后续的.map('mytest2')调用的是原生JS数组的map方法,原生map要求参数必须是函数,传入字符串'mytest2'不符合要求,因此抛出类型错误。 - 显式链式调用(
_.chain(obj))的特性:_.chain会将目标对象包裹成Lodash链式包装对象,后续所有方法调用(包括get、map)都会维持这个包装状态。Lodash的map方法支持传入字符串作为属性名,自动提取数组中每个对象的对应属性值,因此能正常得到预期结果。
核心差异在于:隐式链在方法返回原始值时会自动解包,而显式链会全程保持包装状态,直到调用value()才最终解包获取结果。
内容的提问来源于stack exchange,提问作者Doug Molineux
相关产品推荐
相关产品推荐

