1

鉴于:

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

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

注意:由于我以将匿名函数分配给变量的形式定义函数,因此函数的“名称”属性将无济于事,因为它是空的,这意味着:

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

4 回答 4

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

演示

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

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

演示2

或者一些非常疯狂的东西:

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

演示3

但是你真的最好按照各种评论中提到的那样做(2)。

于 2013-09-18T16:49:26.190 回答
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;
};
于 2013-09-18T17:39:51.003 回答
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']);

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

于 2013-09-18T17:14:50.530 回答
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;
}

编辑:剪切:)

于 2013-09-18T17:55:20.067 回答