【问题标题】:Dynamically execute function within object在对象内动态执行函数
【发布时间】:2019-01-21 04:11:46
【问题描述】:

我有一个像这样的对象结构:

const object = {
  book: '',
  publisher: '',
  author: 'Sally',
  year: '2018',
}

const functionObj = {
  book: validateBook(),
  publisher: validatePublisher(),
  author: validateAuthor(),
  year: validateYear(),
}

我试图通过创建一个以函数作为值的对象来验证这些值,当且仅当它们存在时。所以我的第一个想法是:

const nonEmptyArray = [];
_.each(object , (v, k) => if (v) nonEmptyAddListingArray.push(k);
console.log(nonEmptyArray); // ['author', 'year']

// Execute each function in the array.
_.each(functionObj, (key) => function.key();

这可以实现吗?

【问题讨论】:

  • "…验证值,当且仅当它们存在时"。存在值为“”(空字符串)的属性。我建议验证每个属性并让验证函数完成所有验证。完全可以做你想做的事,你不需要lowdash来做。
  • 查看@Gowri 的回答,invoke 函数将返回它的返回值并将其分配给属性,

标签: javascript object lodash


【解决方案1】:

你应该只分配函数名;通过说book: validateBook(),您将立即调用它。所以改变functionObj如下:

const functionObj = {
  book: validateBook,
  publisher: validatePublisher,
  author: validateAuthor,
  year: validateYear,
}

也不需要单独的数组,一旦验证了 v 而不是推送到数组,只需调用下面的相关函数

_.each(object , (v, k) => if (v) functionObj[k]();

【讨论】:

    【解决方案2】:

    没有 lowdash,您可以使用现有的 ECMAScript 功能。下面的代码看起来很多,因为它为您未发布的代码添加了最少的 polyfill。此外,它使用合理的变量名。

    运行验证是单行的:

    let object = {
      book: '',
      publisher: '',
      author: 'Sally',
      year: '2018',
    };
    
    
    // And define the validation function in the validation object:
    let functionObj = {
      book: function(){
        return this.book === '' || this.book.length > 1;
      },
      publisher: function(){
        return this.publisher === '' || this.publisher.length > 1;
      },
      author: function(){
        return this.author === '' || this.author.length > 1;
      },
      year: function() {
        return this.year === '' || this.year > 1900;
      }
    }
    
    // Run the validation
    let isValid = Object.keys(object).every(key => functionObj[key].call(object));
    
    // which, if minification matters, could be:
    // Object.keys(o).every(k => f[k].call(o));
    
    console.log(`Is valid? ${isValid}`);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多