逻辑:建立机制来解析 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);
}
}
我的需求是将包含字符串的数组解析为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);
}
}