如果lodash存在,它是否有一个单行方法来调用函数?

Agm*_*her 11 javascript lodash

鉴于我有这个代码:

if (_.isFunction(this.doSomething)) {
    this.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

因为loadingComplete是从父控制器传入的指令属性,可能并不总是提供,如果存在,是否有更简洁的单行方式来调用方法,而不重复方法名称?

就像是:

_.call(this, 'doSomething');
Run Code Online (Sandbox Code Playgroud)

sta*_*las 25

_.result(this, 'doSomething', 'defaultValueIfNotFunction')


Har*_*ind 9

从4.0.0版本开始,lodash提供了一种称为invokehttps : //lodash.com/docs/4.15.0#invoke的方法

var object = {
  add: function(a, b) { return a + b }
};

_.invoke(object, 'add', 1, 2);
// => 3

_.invoke(object, 'oops');
// => undefined
Run Code Online (Sandbox Code Playgroud)

请注意,如果由于某种原因在您提供的键上除了功能以外还有其他东西,它仍然会爆炸。


Sha*_*art 5

更新资料

@stasovlas的答案是正确的方法。


快捷方便

您一直在寻找的机器人:

_.get(this, 'doSomething', _.noop)()
Run Code Online (Sandbox Code Playgroud)

它是相当自我记录的,在功能上等同于:

if (this.doSomething) {
  this.doSomething();
} else {
  _.noop();
}
Run Code Online (Sandbox Code Playgroud)

更好地重用

如果要在整个代码库中重用此代码,可以使用mixin使其更具可读性和简洁性,然后将其烘烤到lodash中:

var runIfFunction = function(value) {
  if (_.isFunction(value)) {
    return value();
  }
};

_.mixin({runIfFunction: runIfFunction});
Run Code Online (Sandbox Code Playgroud)

这允许您执行以下操作:

_.runIfFunction(this.doSomething);
Run Code Online (Sandbox Code Playgroud)

  • 对,那是正确的。无论如何,这不是主要缺点,只是一些需要注意的地方。 (2认同)

Jac*_*ang 5

较新的 Javascript / Typescript 版本本身支持它

const result = someInterface.nullableMethod?.();
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

(有关本机浏览器支持,请参见页面底部)


Emi*_*röm 0

这有点难看,但你可以使用结果

_.result({fn: this.doSomething}, 'fn');
Run Code Online (Sandbox Code Playgroud)

  • 它很丑陋,如果我在我正在审查的某些代码中看到它,我将不知道它做了什么。这不是对你的反映,只是我认为OP使用lodash来解决这个非问题是错误的。 (6认同)