Оправдано ли здесь использование eval ()? - PullRequest
4 голосов
/ 24 ноября 2010

Объект JavaScript data имеет атрибут «амплитуды», представляющий собой связную строку массивов битовых масок, поступающих с сервера.

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 ]

6 голосов
/ 24 ноября 2010

Поскольку вы, вероятно, обрабатываете свои данные на серверном языке, просто создайте массив 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 + ']');
2 голосов
/ 24 ноября 2010

Если вы можете изменить сервер, просто укажите в свойстве «амплитуды» массив массивов и не пишите его в кавычках:

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

Теперь вашему клиенту не нужно декодировать ввсе.

1 голос
/ 24 ноября 2010

Функция 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]);
  }
 }
0 голосов
/ 24 ноября 2010

Ну, вы можете попробовать использовать JSON для передачи объекта javascript непосредственно с сервера, по сравнению с простым возвращением строки.Почти все языки на стороне сервера поддерживают кодирование / декодирование JSON в той или иной форме.

http://www.json.org/

...