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)我也愿意操纵字段“幅度”存储在数据库中的格式,以便我的整体设计变得更简单。
欢迎提出建议
答案 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编码/解码。