Возвращает массив функций в виде массива логических значений

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

что я имею

// 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'](''),

другие вопросы

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

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

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

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

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

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

Для более общего подхода правильный инструмент здесь, кажется, Arrays.prototype.map(), Тем не менее, поскольку у вас есть объект, содержащий все ваши функции, а не массив функций, вам понадобится какой-то способ установить соответствие. Вы можете легко сделать это с помощью отдельного массива имен свойств (например, ['required', 'isObject']). Тогда вы можете сделать что-то вроде этого:

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

var results = ['required', 'isObject'].map(
    function(test, i) {
        return functions[test](args[i]);
    }
);

Конечно, если functions Если бы вместо объекта был массив, вы могли бы упростить это:

var functions = [
    /* required : */ function(value){
        return value.length > 0;
    },
    /* isObject : */ function(value){
        return typeof value == 'object';
    }
];
var args = ['', {key: 'v'}];

var results = functions.map(
    function(test, i) {
        return test(args[i]);
    }
);

Если вы хотите немного инкапсулировать это, вы можете передать args массив в качестве второго аргумента map(), в этом случае внутри функции вы будете использовать this[i] вместо args[i],

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

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

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

То, что вы хотите, это 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);
Другие вопросы по тегам