逻辑:建立机制来解析 javascript 数组,直到每一行都被考虑在内

Logic : Make mechanism to parse a javascript array until each row has been taken under account

我的需求是将包含字符串的数组解析为eval()。我知道 eval() 安全威胁并假设 一切正常。

数组由 PHP 脚本在服务器端生成,该脚本会查看一堆指定的文件夹,使用 file_gets_contents() 加载每个文件并将每个内容注入数组的一行。然后它将最终数组发送给客户端。

在我的设计中,有利有弊,数组中的一些脚本用于初始化一些对象,其他使用对象进行逻辑。如您所料,要使其顺利运行,必须按正确的顺序 eval()ed。否则 javascript 会抛出错误。

我的问题如下:数组中的脚本是无序的。出于特定原因,超出此处的范围,我不想既不订购数组服务器端,也不向客户端传递任何指示(例如array[key])告诉它如何重组它接收到的无序脚本。

相比之下,我正在尝试建立一种能够解析数组的机制,在队列中发送所有来得太早的脚本,eval() 其他脚本,最后 eval()队列的其余部分。

到目前为止,我的想法是 try ... catch 每个 eval()Array.forEach() 语句中, splice() 数组删除每个已正确 eval()ed,让有错误的脚本留在数组中,然后调用Array.forEach()直到array.length === 0

作为案例研究,我正在寻找能够在循环中解析数组示例的每一行,决定 splice() 该行(因为 delete 并没有真正删除...) 或将其放在数组中,然后重新循环以检查是否存在一行。

为了说明我的观点,我提供了这些不起作用的示例。仍在调试中...

this.a = [ //the array that reproduce the situation (seems to work)
    'o = {}', // I declare o as a global namespace
    'o.a.b.c = "a string"', //I declare a value in o.a.b.c, too early
    'o.a.b = {}', //I declare o.a.b, but o.a doesn't exist
    'o.a = {}', //I declare o.a, too late
];

var build = function(value,key,array){

    try{
        eval(value);
        this.a = array.slice(key);
    }catch(error){
        console.log(error.message);
        this.a.push(value);
    }finally{
        if(this.a.length === 1) this.a = [];//Take care of infinite loop risk, as the "while" below does not carry the variable to zero...
    }

}.bind(this);

while(this.a.length > 0){
    this.a.forEach(build);
    console.log(this.a.length);
};

console.log(this.a);

有没有哪位逻辑能力强的可以帮忙?

您的脚本存在一些问题:

  • this.a = array.slice(key);好像没有什么意义?
  • this.a = array.push(value);a 设置为数组的长度
  • if(this.a.length === 1) this.a = []; - 不确定您要在此处保护的是什么无限循环?
  • this.a.forEach(build); 如果您在遍历数组时尝试修改它,这听起来像是个坏主意。

我的方法会简单得多——只需将数组用作队列即可:

this.a = [ //the array that reproduce the situation (seems to work)
    'var o = {}', // I declare o as a global namespace
    'o.a.b.c = "a string"', //I declare a value in o.a.b.c, too early
    'o.a.b = {}', //I declare o.a.b, but o.a doesn't exist
    'o.a = {}', //I declare o.a, too late
];

while (this.a.length) {
    var value = this.a.shift();
    try {
        (null, eval)(value);
    } catch(error) {
        if (error instanceof SyntaxError) break;
        this.a.push(value);
    }
}