Javascript:给定函数列表,如何创建一个将这些函数作为属性的对象

Javascript: given list of functions, how to create an object having those functions as properties?

本文关键字:函数 一个 对象 属性 创建 列表 Javascript 何创建      更新时间:2023-09-26

给定:

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 === ""
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)的事情,如各种评论中所述。

通过查看全局范围的属性来查找匹配值,这是可能的:

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']);

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

似乎您最初应该只创建对象,而不是数组。但是如果你只想分配任意函数名称,你可以做这样的事情:

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

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

如果你提前知道它们并且可以放入一个数组,那么你的代码将只是:

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

编辑:切:)