Javascript:给定函数列表,如何创建具有这些函数作为属性的对象?

时间:2013-09-18 16:47:27

标签: javascript

假设:

var f1 = function(){return "a";};
var f2 = function(){return "b";};
var f3 = function(){return "c";};
transformToObject([f1, f2, f3]);

如何创建功能:

function transformToObject(arrayOfFuncs){...};

返回:

{
    f1: function(){return "a";},
    f2: function(){return "b";},
    f3: function(){return "c";}
}

难度似乎是获取变量的名称来创建对象的属性。

注意:由于我以匿名函数赋值给变量的形式定义函数,函数的“name”属性无效,因为它是空的, 这意味着:

function a(){};
//a.name === "a"
var b = function(){};
//b.name === ""

4 个答案:

答案 0 :(得分:3)

var f1 = function(){return "a";};
var f2 = function(){return "b";};
var f3 = function(){return "c";};

var obj = {f1: f1, f2: f2, f3: f3};

alert(obj.f1());

Demo

根据您的编辑,可能是这样的:

var f1 = function(){return "a";};
var f2 = function(){return "b";};
var f3 = function(){return "c";};

function transformToObject(){
    return {f1: f1, f2: f2, f3: f3};
}

var myObjectHasFunctions = transformToObject();

alert(myObjectHasFunctions.f1());

Demo2

或者真是狂野的事情:

var f1 = function a(){return "a";};
var f2 = function b(){return "b";};
var f3 = function c(){return "c";};

var arrayOfFuncs = [f1, f2, f3]

function transformToObject(arrayOfFuncs){
    var obj = {}
    obj.functions = []

    arrayOfFuncs.forEach(function(test){
        obj.functions.push({name: test.name, method: test})
    });

    return obj;
}

var myObjectHasFunctions = transformToObject(arrayOfFuncs);

myObjectHasFunctions.functions.forEach(function(func){
    alert(func.method());    
});

Demo3

但你最好做各种评论中提到的(2)。

答案 1 :(得分:0)

通过查看匹配值的全局范围的属性,可以种类

var transformToObject = (function(scope){
  return function(arrayOfFuncs){
    var obj = {};
    for(var prop in scope){
      if(scope.hasOwnProperty(prop) && arrayOfFuncs.indexOf(scope[prop]) > -1){
        obj[prop] = scope[prop]
      }
    }
    return obj
  }
})(this)

......虽然这是一件非常糟糕的事情

如果可能的话 - 你最好将你的功能修改为:

transformToObject(['fn1','fn2','fn3']);

更好的是,从一开始就将函数作为对象的属性。

答案 2 :(得分:0)

看起来你应该最初创建对象,而不是数组。 但是如果你只想分配任意函数名,你可以这样做:

function transformToObject(arrayOfFuncs){
  var len = arrayOfFuncs.length,
      functionMap = {},
      funcName;
  for (i=0; i<len; i++) {
    funcName = "f" + i;
    functionMap[funcName] = arrayOfFuncs[i];
  }
  return functionMap;
};

答案 3 :(得分:0)

问题是函数的名称在您的代码中丢失,因此无法恢复。您需要以某种方式提供它们。

如果你事先了解它们并且可以放入一个数组,那么你的代码就是:

function transformToObject(fns, names) {
  var r = {};
  for (var i = 0, n = fns.length; i < n; ++i) r[names[i]] = fns[i];
  return r;
}

如果您有一个函数可以返回给定函数的名称:

function transformToObject(fns, namer) {
  var r = {}
  for (var i = 0, n = fns.length; i < n; ++i) r[namer(fns[i])] = fns[i]
  return r;
}

编辑: CUT:)