2015-01-29 3 views
-1

Мне нужно что-то вроде ассоциативного массива, который содержит пары идентификаторов имен/элементов.Создание динамических переменных с использованием eval javascript

Цикл через этот массив/объект присваивает идентификатор элемента имени переменной, являющемуся его аналогом. Что-то вроде этого:

jsFiddle

HTML: 

<input id="fld_1" class="input" type="text" value="bob" /><br> 
<input id="fld_2" class="input" type="text" value="fred" /><br> 
<input id="fld_3" class="input" type="text" value="pat" /><br> 
<input id="mybutt" class="btn" type="button" value="Test" /> 

js: 

objFields = {'f1':'fld_1', 'f2':'fld_2', 'f3':'fld_3'}; 
arrErrors = []; 

$('#mybutt').click(function(){ 
    alert('iii'); 
    for (var key in objFields){ 
    // eval(key = objFields[key]); 
     eval(key) = objFields[key]; 
     alert('f1: ' +f1); 
    } 
}); 

Там нет требования к использованию eval, мне просто нужно повернуть ключ в имени переменной.

Может кто-нибудь показать мне, где я ошибся?

UPDATE и РЕШЕНИЕ:

JCOC611 получил это право, но я не ясно, как я задал вопрос. Как demo'd в this revised fiddle which implements JCOC611's solution, имена переменных/полей должны были быть использованы для получения значения содержимого поля, так:

$('#mybutt').click(function(){ 
    for (var key in objFields){ 
     var tmp = objFields[key]; 
     eval('var ' + key+ ' = $("#' +tmp+ '").val()'); 
    } 
}); 
+2

Есть ли конкретная причина, почему вы должны установить переменную и не использовать 'objFields [ "f1"]'? – JCOC611

+2

'window [key]', который бы сделал глобальные переменные, но не советовал помещать произвольные переменные в глобальную область. –

+0

Я думаю, что вы, вероятно, имеете дело с проблемой не знать, как обращаться к элементам из асинхронного вызова вне вызова функции, если вы считаете, что вам нужно записывать данные в глобальную область. Правильный подход здесь - обратные вызовы. –

ответ

3

Если вы знаете, что вы делаете и абсолютно уверен в этом, а затем использовать это:

eval(key + " = " + JSON.stringify(objFields[key])); 

Или, если вы хотите, локальные переменные:

eval("var " + key + " = " + JSON.stringify(objFields[key])); 

В противном случае, Я советую вам выполнить один из других ответов.

+0

Странно, когда вы выполняете' eval ('var testing = 5') 'в консоли браузера, он по-прежнему создается как свойство объекта 'window', но когда вы [делаете это в скрипке] (http://jsfiddle.net/f6aq97cs/), это не так. Я что-то упустил? – Stryner

+0

@Stryner: использование 'var' в консоли браузера почти ничего не делает, потому что оно не находится внутри какого-либо кодового блока (оно находится в глобальной области). – JCOC611

+0

@Stryner, посмотрите на параметры левой стороны, ваш JS-код запускается внутри вызова функции onLoad, вы можете изменить его на _no wrap в head_, а затем вы увидите, что он установлен как глобальная переменная –

2

Вам не нужно, что eval() на всех, и вы хотите чтобы избежать этого. Все, что вам действительно нужно сделать, это:

for (var key in objFields){ 
    alert(key+': '+objFields[key]); 
    window[key] = objFields[key]; 
} 

Даст вам:

'f1':'fld_1' 
'f2':'fld_2' 
'f3':'fld_3' 

Где:

f1 = 'fld_1'; 
f2 = 'fld_2'; 
f3 = 'fld_3'; 
+0

Вы тоже правы, Спенсер, но я не понял, как я задал этот вопрос. Вот [пересмотренный jsFiddle] (http://jsfiddle.net/jxqL4pyg/3/), используя ваше решение. Он отлично работает, но eval по-прежнему требуется для фактической цели. – crashwap

+0

@crashwap Уверен, я имею в виду, что лучше избегать 'eval()' вообще, если это пользовательский ввод каким-либо образом, так как можно злоупотреблять. –

0

Если это глобальная переменная, это так же просто, как:

window[key] = objFields[key]; 

или

window.key = objFields[key]; 

Второй недостаток weird name иммунный.

+2

второй не работал бы, как хочет op, так как вы просто создавали переменную/свойство с именем 'key' –

0

Функция eval запускает строку, добавляет код и возвращает результат.

Что ваш код сделал, это оценить неопределенный ключ, который не определен, а затем попытался установить его на новое значение. Походит на запись 5 = ​​4;

Правильный синтаксис:

eval('var ' + key + ' = ' + objFields[key]); 
+2

Я хочу, чтобы ваш ответ был правильным, потому что ваше имя так близко к 'eval' – Hogan

+0

@crashwap, спасибо – Eyal

+0

JCOC611 верен - требуется JSON.stringify, если только переменная не вышла за пределы выражения eval. См. [Пересмотренный jsFiddle] (http://jsfiddle.net/jxqL4pyg/2/) – crashwap

Смежные вопросы