Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用方法在Lodash中是如何工作的? 背景_Javascript_Underscore.js_Lodash - Fatal编程技术网

Javascript 调用方法在Lodash中是如何工作的? 背景

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的项

从有关该方法的文档中,我了解到:

对集合中的每个元素调用methodName命名的方法,并返回每个被调用方法的结果数组

因此,我假设以下代码是同义的,但事实并非如此:

_.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)
})