2010-11-24 4 views
4

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

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) Я также открыт для манипулирования форматом, в котором «амплитуды» поля хранятся в базе данных, так что мой общий дизайн становится проще.

Предложения приветствуются

ответ

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 + ']'); 
2

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

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

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

+0

У меня есть только один амплитуды полей, чтобы сохранить все битмаски вместе в базе данных. «Амплитуды» - один из многих атрибутов, которые отправляются в json – papdel 2010-11-24 16:54:35

+0

Пример Json: {«options»: «a, b, c», «qs_id»: 4, «амплитуды»: «[1,1,1 , 4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1 , 1,1,1,1,1,1,1,1,1,1,1] ", " Требования ":" 1,2,2,1,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 "} – papdel 2010-11-24 16:55:42

+0

Вы сохраняете« амплитуды »как * строку *, как в базе данных? Тьфу. – Pointy 2010-11-24 17:02:26

0

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

http://www.json.org/

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]); 
    } 
} 
Смежные вопросы