所以我正在努力更新一些旧项目,我正在努力找到一个我想要完成的事情的来源或例子。
我拥有的
// 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 :(得分:2)
这个怎么样。
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);
});
运行它应该为您提供一个来自对象函数的返回值数组。
答案 1 :(得分:1)
平凡地说,这可以通过以下方式完成:
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]
代替{ {1}}。
答案 2 :(得分:0)
当然有可能。像这样:
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");
答案 3 :(得分:0)
您想要的是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);
答案 4 :(得分:0)
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));