假设:
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 === ""
答案 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());
根据您的编辑,可能是这样的:
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());
或者真是狂野的事情:
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());
});
但你最好做各种评论中提到的(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:)