Javascript 调用方法在Lodash中是如何工作的? 背景
从有关该方法的文档中,我了解到: 对集合中的每个元素调用methodName命名的方法,并返回每个被调用方法的结果数组 因此,我假设以下代码是同义的,但事实并非如此:Javascript 调用方法在Lodash中是如何工作的? 背景,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,从有关该方法的文档中,我了解到: 对集合中的每个元素调用methodName命名的方法,并返回每个被调用方法的结果数组 因此,我假设以下代码是同义的,但事实并非如此: _.map(items, function(item) { return _.omit(item, 'fieldName'); }) _.invoke(items, _.omit, 'fieldName'); 在这种情况下,invoke方法生成一个字符串数组,而map方法返回一个从每个项目中删除了fieldName的项
_.map(items, function(item) {
return _.omit(item, 'fieldName');
})
_.invoke(items, _.omit, 'fieldName');
在这种情况下,invoke
方法生成一个字符串数组,而map方法返回一个从每个项目中删除了fieldName
的项目数组
问题
- 如何使用
方法获得与invoke
函数相同的结果map
- 为什么在这种特殊情况下,
返回字符串数组调用
var items=[{id:1,名称:'foo'},
{id:2,名称:'bar'},
{id:3,名称:'baz'},
{id:4,名称:'qux'}];
console.log(
_.invoke(项,省略'id')
);
console.log(
_.map(项目、功能(项目){
返回u.omit(项“id”);
})
);代码>
invoke
将函数作为实例方法调用
比如说,
[
(new Date()).toString(),
(new Date()).toString(),
(new Date()).toString()
]
可以重写为:
_.invoke([new Date(), new Date(), new Date()], 'toString')
它大致类似于map
,其中map
被传递一个函数,而invoke
被传递一个实例的方法
如果您真的想让invoke
在这里为您工作,那么我想您可以这样做:
var items = [{id:1, name:'foo'},
{id:2, name:'bar'},
{id:3, name:'baz'},
{id:4, name:'qux'}];
_.invoke(items, function() { return _.omit(this, 'id') });
// => [Object {name="foo"}, Object {name="bar"}, Object {name="baz"}, Object {name="qux"}]
但你不应该那样做。只需使用map
var result = _.invoke(items, fn, extraArgs)
相当于
var result = [];
for (var i=0; i<items.length; i++) {
result.push( fn.apply(items[i], extraArgs) );
}
唯一的区别是item
不是函数的参数,相反,当函数应用于该项时,您需要使用this
。如建议,更适合于此
var collection = [
{ id:1, name:'foo' },
{ id:2, name:'bar' },
{ id:3, name:'baz' },
{ id:4, name:'qux' }
];
_.map(collection, _.ary(_.partialRight(_.omit, 'id'), 1));
// →
// [
// { name: 'foo' },
// { name: 'bar' },
// { name: 'baz' },
// { name: 'qux' }
// ]
确保注意您正在使用的lodash版本
v4.11.1在集合上操作时使用:
_.invokeMap([1,2,3], function () {
console.log(this)
})
您正在寻找类似这样的内容:.invoke(items,function(){return}.omit(this'a')})代码>?此代码段使用lodash 4.17为u0.invoke(未定义)提供了不同的结果
_.invokeMap([1,2,3], function () {
console.log(this)
})