Поэтому я работаю над обновлением некоторых старых проектов и пытаюсь найти источник или пример чего-то, чего я пытаюсь достичь.

что у меня есть

// sample object of functions
var functions = {
    required : function(value){
        return value.length > 0;
    },
    isObject : function(value){
        return typeof value == 'object';
    }
};

Выше приведен образец функций в объекте. Я хочу знать, можно ли сделать следующее:

псевдокод

//user input
var funcs = [required(''), isObject({key : 'v'})];

// what the function I'm building will process, in a sense
functions[funcs[i]](//arguments from funcs[i]);

// what would remain after each function
funcs = [false, true] // with an end result of false

Я не уверен на 100%, что это невозможно сделать, я просто не уверен, что в малейшей степени подобное может произойти. Давайте представим некоторые идеи здесь и посмотрим, что мы придумали.

Дайте мне знать, если вы все нуждаетесь в каких-либо разъяснениях по поводу всего, что я просил. Спасибо заранее за помощь!

разъяснение того, чего я пытаюсь достичь

Объект функций не является конечным, для этой конкретной программы, которую я пишу, может быть любое количество функций. Они будут предопределены, поэтому пользовательский ввод не будет проблемой. Мне нужно иметь возможность определить, какая функция вызывается при ее передаче, и убедиться, что все аргументы, переданные с помощью указанной функции, присутствуют и также передаются. Поэтому, когда я передаю required(''), мне нужно пройти через мой объект функций и найти functions['required'] и передать ему пустое строковое значение. Вот так functions['required']('').

другие проблемы

Объект функций имеет частный доступ, и пользователь не будет иметь к нему прямого доступа.

0
Mark Hill 17 Дек 2015 в 01:29

5 ответов

Лучший ответ

Как насчет этого.

var functions = {
    required : function(value){
        return value.length > 0;
    },
    isObject : function(value){
        return typeof value == 'object';
    }
};

// Because these values are user inputs, they should be strings,
// so I enclosed them in quotes.
var funcs = ["required('')", "isObject({key: 'v'})"];

funcs.map(function(e) {
    return eval('functions.' + e);
});

Запуск этого должен дать вам массив возвращаемых значений от функций в объекте.

2
Will 16 Дек 2015 в 22:51
var functions = {
    required : function(value){
        return value.length > 0;
    },
    isObject : function(value){
        return typeof value == 'object';
    }
};

var funcs = ["required('')", "isObject({key: 'v'})"];

function f(funcs){
  return funcs.map(function(e) {
      return eval('functions.' + e);
  });
}

console.log(f(funcs));
0
user1718888 16 Дек 2015 в 23:22

То, что вы хотите, это map функция. Вы можете имитировать это так (я думаю, если вы хотите одну строку):

https://jsfiddle.net/khoorooslary/88gh2yeh/

var inOneLine = (function() {
    var resp = {};
    var i = 0;
    var fns = {
      required : function(value){
          return value.length > 0;
      },
      isObject : function(value){
          return typeof value == 'object';
      }
    };
    for (var k in  fns) resp[k] = fns[k](arguments[i++]);
    return resp;
}).apply(null,  [ '' , {key : 'v'}]);

console.log(inOneLine);
0
zagros 16 Дек 2015 в 22:42

Конечно, это возможно. Что-то вроде этого:

var results = [];
var value = "value_to_pass_in";

for(var f in functions)
{
    results.push(f.call(this, value));
}

ОБНОВИТЬ:

function superFunc(value)
{
    var results = [];

    for(var f in functions)
    {
        results.push(f.call(this, value));
    }

    return results;
}

superFunc("value_to_pass_in");
0
raduation 16 Дек 2015 в 22:42

Тривиально, это можно сделать с помощью:

var tests = [functions.required(''), functions.isObject({key: 'v'})];

Если это все, что вам нужно, примите во внимание мой ответ.

Для более общего подхода правильный инструмент здесь выглядит как

Ted Hopp 16 Дек 2015 в 22:52