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

时间:2016-02-19 13:06:13

标签: javascript lodash

鉴于我有这段代码:

if (_.isFunction(this.doSomething)) {
    this.doSomething();
}

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

类似的东西:

_.call(this, 'doSomething');

7 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:6)

从版本4.0.0开始,lodash提供了一个名为invoke的方法:https://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

请注意,如果出于某种原因,其他与您提供的密钥上的某个功能相比,它仍然会爆炸。

答案 2 :(得分:4)

更新

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

快捷方便

你一直在寻找的机器人:

_.get(this, 'doSomething', _.noop)()

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

if (this.doSomething) {
  this.doSomething();
} else {
  _.noop();
}

更好地重复使用

如果你想在你的代码库中重复使用它,你可以使用mixin使它更具可读性和简洁性,并将其烘焙到lodash中:

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

_.mixin({runIfFunction: runIfFunction});

允许您这样做:

_.runIfFunction(this.doSomething);

答案 3 :(得分:4)

较新的Javascript / Typescript版本本机支持

const result = someInterface.nullableMethod?.();

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

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

答案 4 :(得分:0)

这有点难看,但您可以使用result

_.result({fn: this.doSomething}, 'fn');

答案 5 :(得分:0)

如果this.doSomething是函数或未定义/假,则:

this.doSomething && this.doSomething();

是一种常用的模式。

答案 6 :(得分:-2)

if (_.isFunction(this.doSomething)) {
    this.doSomething();
}

在一行中:

if (_.isFunction(this.doSomething)) this.doSomething();