【问题标题】:Does lodash have a one-line method for calling a function if it exists?如果存在,lodash 是否有调用函数的单行方法?
【发布时间】:2016-02-19 13:06:12
【问题描述】:

鉴于我有这个代码:

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

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

类似:

_.call(this, 'doSomething');

【问题讨论】:

  • 如果doSomething 不是要调用的函数,你会期待什么?
  • Nothing... 因此我将它包裹在 if...
  • 你永远无法确定函数是否被调用。我认为这对您的代码可能非常危险。
  • lodash 不应该用于一切。坚持条件。
  • 这是一个值得思考的问题。

标签: javascript lodash


【解决方案1】:
_.result(this, 'doSomething', 'defaultValueIfNotFunction')

【讨论】:

  • 当你有一个具有相同属性但需要传递参数的对象时,你如何将参数传递给doSomething
  • 没关系_.forIn(objects, function(object) { _.invoke(object, 'method', args) });
【解决方案2】:

从 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

请注意,如果由于某种原因其他不是您提供的键上的功能,它仍然会爆炸。

【讨论】:

  • +1 _.invoke_.result 更适合 OP 用例,因为它允许传递参数,而且命名更恰当。 _.result 似乎更适合调用需要访问 this 的简单 getter。
【解决方案3】:

较新的 Javascript / Typescript 版本原生支持它

const result = someInterface.nullableMethod?.();

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

(原生浏览器支持见页面底部)

【讨论】:

    【解决方案4】:

    这有点难看但是你可以使用result:

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

    【讨论】:

    • 这很丑陋,如果我在我正在审查的某些代码中看到它,我将不知道它做了什么。这不是对你的反映,只是我认为 OP 使用 lodash 解决这个非问题是错误的。
    • 这是一个偏好问题,我认为如果你有一个对象持有字符串或 getter(它们是没有参数的简单函数)并且仍然想要获取值(甚至是默认值),这并不难看)
    【解决方案5】:

    如果this.doSomething 是一个函数或未定义/虚假,那么:

    this.doSomething && this.doSomething();
    

    是一种常用的模式。

    【讨论】:

    • "不重复方法名"
    • 是的,这是一个愚蠢的要求。 var x = this.doSomething; x && x();
    • @James,这不是一个愚蠢的要求.....很明显,我只是想要一种有条件地调用函数的简单简洁的方法。我喜欢干净、简短的代码。对不起,如果这冒犯了你。
    • _.isFunction(this.doSomething) && this.doSomething(); 很简洁。
    • 一点也不冒犯我,但最好的方法是检查 x 是否存在(或者是一个函数),然后调用 x.对 x 进行两种不同的操作,因此需要重复方法名称。任何假装只使用方法名称一次的东西都是将其检查 + 调用包装在某种函数中。
    【解决方案6】:
    if (_.isFunction(this.doSomething)) {
        this.doSomething();
    }
    

    一行:

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

    【讨论】:

    • "不重复方法名"
    • 丢弃大括号并不能使其成为“一个衬里”,它会使其格式不正确。许多常见的 js linter 会抱怨你的“优化”
    猜你喜欢
    • 2018-04-24
    • 2015-07-30
    • 1970-01-01
    • 2018-09-30
    • 2022-12-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多