将函数数组作为布尔数组返回

时间:2015-12-16 22:29:52

标签: javascript arrays

所以我正在努力更新一些旧项目,我正在努力找到一个我想要完成的事情的来源或例子。

我拥有的

// 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 个答案:

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