Возвращает массив функций в виде массива логических значений
Поэтому я работаю над обновлением некоторых старых проектов и пытаюсь найти источник или пример чего-то, что я пытаюсь выполнить.
что я имею
// 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);