从数组中删除引号以充当函数(变量)

时间:2017-10-07 15:17:15

标签: javascript arrays json

我从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?

谢谢!

4 个答案:

答案 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()对数组进行迭代,并使用关键字windowthis访问Global context中的函数。

使用this[fn]()的代码示例:

&#13;
&#13;
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;
&#13;
&#13;