_.invoke方法如何在Lodash中运行?

Pet*_*ete 7 javascript underscore.js lodash

背景

从有关invoke方法的文档中,我读到:

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

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

_.map(items, function(item) {
    return _.omit(item, 'fieldName');
})

_.invoke(items, _.omit, 'fieldName');
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该invoke方法生成一个字符串数组,而map方法返回fieldName从每个项目中删除的项目数组.

问题

  • 如何使用该invoke方法实现与map函数相同的结果?
  • 为什么invoke在这种特殊情况下返回字符串数组?

var items = [{id:1, name:'foo'}, 
             {id:2, name:'bar'}, 
             {id:3, name:'baz'}, 
             {id:4, name:'qux'}];

console.log(
    _.invoke(items, _.omit, 'id')
);

console.log(
    _.map(items, function(item) {
        return _.omit(item, 'id');
    })
);
Run Code Online (Sandbox Code Playgroud)
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.3.1/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

flo*_*bon 9

var result = _.invoke(items, fn, extraArgs)
Run Code Online (Sandbox Code Playgroud)

相当于

var result = [];
for (var i=0; i<items.length; i++) {
  result.push( fn.apply(items[i], extraArgs) );
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您想要与地图相同的结果,那就是

_.invoke(items, function() {
  return _.omit(this, 'id');
})
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,item它不是函数的参数,而是需要this在函数应用于项目时使用.


che*_*pus 7

请务必记下您正在使用的lodash版本.

v4.11.1 _.invokeMap在对集合进行操作时使用:

_.invokeMap([1,2,3], function () {
    console.log(this)
})
Run Code Online (Sandbox Code Playgroud)