我从JSON对象获取一个数组。然后我想迭代那个数组,因为它们是函数名,我想让它们运行。
如果我手动操作,以下内容将起作用。
var view_functions = [
header,
footer
];
for (i = 0; i < view_functions.length; i++) {
view_functions[i]();
}
但是view_functions变量应该来自JSON,而不是手动完成的。 JSON部分如下所示,它是一个数组。
"functions" : ["header","footer"]
所以当我抓住JSON时,它是一个带引号的数组。如何使这个像没有引号的工作view_functions var?
谢谢!
答案 0 :(得分:1)
也许你可以试试这个:
var view_functions = you_json_obj.functions; // ["header", "footer"]
for (let fn of view_functions) {
window[fn]();
}
答案 1 :(得分:1)
首先,没有JSON“对象”这样的东西。 JSON是一种字符串格式。
如果将函数存储在“虚拟”对象中(仅用于作用域),则可以访问与数组中的名称匹配的属性名称。
var view_functions = { "functions" : ["header" , "footer"] };
var dummy = {
header: function(){ console.log("header"); },
footer: function(){ console.log("footer"); }
};
// Loop over the strings in the array and invoke the function
// with the matching key in the dummy object:
view_functions.functions.forEach(function(f){
dummy[f]();
});
答案 2 :(得分:0)
取决于:如果函数在全局范围内,您可以执行以下操作:
window[view_functions[i]]();
请记住,所有全局定义的函数实际上都是全局窗口对象的方法。因此可以使用括号表示法window[...]
来访问它们。因此,为避免使用eval
,您可以使用括号表示法。
如果它们是对象的方法,则可以用对象替换window
。
检查函数是否存在是个好主意:
Object.prototype.toString(window[view_functions[i]]) === "[object Function]"
var funcObj = JSON.parse("{\"functions\" : [\"header\" , \"footer\"]}");
header = function() {
console.log("test header");
}
footer = function() {
console.log("test footer");
}
for (var i = 0; i < funcObj.functions.length; i++) {
if (Object.prototype.toString.call(window[funcObj.functions[i]]) === "[object Function]") {
window[funcObj.functions[i]]();
}
};
答案 3 :(得分:0)
您可以使用Array.prototype.forEach()对数组进行迭代,并使用关键字window
或this
访问Global context中的函数。
使用this[fn]()
的代码示例:
function header () {
console.log("function header");
}
function footer () {
console.log("function footer");
}
const view_functions = {
"functions": ["header" , "footer"]
};
view_functions.functions.forEach(fn => this[fn]());
&#13;