eval()的用法在这里是否合理?

时间:2010-11-24 16:48:06

标签: javascript eval

JavaScript对象data有一个属性'amplitudeitude',它是来自服务器的字符串串联的位掩码数组。

var data = {
  "amplitudes":           
  "[1,1,1,4,1,1],[1,1,1,1,1,1],[1,1,4,1,9,1],[1,1,9,1,16,1],[1,32,1,1,1,9],[4,4,4,1,1,1]"
}

这需要分解为六个独立的数组。我使用split()eval()的组合以下列方式完成它:

var amplitudes = [];
amplitudes = data.amplitudes.split("],[");
for(var i=0;i<amplitudes.length;i+=1){
    (i+1)%2>0 ? amplitudes[i] = amplitudes[i] + "]" : amplitudes[i] = "[" + amplitudes[i];
    amplitudes[i] = eval(amplitudes[i]);
}

问题


1)是否有更强的优雅高效方式?我对eval()的使用不太满意,但感觉分裂比正则表达更有效吗?我还没有运行基准测试。

2)我也愿意操纵字段“幅度”存储在数据库中的格式,以便我的整体设计变得更简单。

欢迎提出建议

4 个答案:

答案 0 :(得分:6)

由于您可能使用服务器端语言处理数据,因此只需生成JavaScript数组即可。如果服务器端代码中有数组,请使用JSON编码器构建JavaScript对象/数组。

var data = {
  "amplitudes": [[1,1,1,4,1,1], [1,1,1,1,1,1], [1,1,4,1,9,1], [1,1,9,1,16,1], [1,32,1,1,1,9], [4,4,4,1,1,1]]
}

如果你无法改变从服务器获得的内容,你可以使用eval但以更简单的方式来实现:

var str = "[1,1,1,4,1,1],[1,1,1,1,1,1],[1,1,4,1,9,1],[1,1,9,1,16,1],[1,32,1,1,1,9],[4,4,4,1,1,1]";
var arr = eval('[' + str + ']');

答案 1 :(得分:2)

如果您可以更改服务器,只需将“amplitude”属性设为数组数组,并且不要用引号将其写出来:

var data = {
  amplitudes: [ [1, 1, 1, 4, 1, 1 ], [ 1, 1, 1, 1, 1, 1 ], ... ]
};

现在您的客户端根本不需要解码。

答案 2 :(得分:1)

eval()函数通常用于解码被认为是“安全”的JSON数据,因为在用户定义的数据上使用eval会导致XSS攻击。无论如何,通过使用正则表达式匹配数组,您可以使代码更优雅,然后使用eval解码数组组件:

var matches = data.amplitudes.match(/\[.*?\]/g);
 var amplitudes = [];

 if (matches != null && matches.length > 0) {
  for (var i = 0; i < matches.length; i++) {
   amplitudes[i] = eval(matches[i]);
  }
 }

答案 3 :(得分:0)

您可以尝试使用JSON直接从服务器传递javascript对象,而不是只返回一个字符串。几乎每种服务器端语言都支持某种形式的JSON编码/解码。

http://www.json.org/