Динамически выполнять функцию внутри объекта - PullRequest
0 голосов
/ 21 января 2019

У меня есть структура объекта вроде:

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();

Возможно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Без lowdash вы можете использовать стандартные функции ECMAScript.Следующее выглядит много кода, потому что он имеет минимальное количество полизаполнений для кода, который вы не опубликовали.Кроме того, он использует разумные имена переменных.

Запуск проверки выполняется в один слой:

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}`);
0 голосов
/ 21 января 2019

Вы должны просто назначить имя функции;сказав book: validateBook(), вы немедленно вызовете его.поэтому измените functionObj, как показано ниже:

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

Также не требуется отдельный массив, и каждый, после проверки v вместо нажатия на массив, просто вызовите связанную функцию, как показано ниже

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