2013-04-03 2 views
2

Мне нужно динамически создавать переменные внутри цикла, но я понятия не имею, как это сделать. Я прочитал об использовании eval();, но все, что я нашел, это просто динамическое изменение значения внутри переменной.Динамические переменные имен javascript

мне нужно что-то вроде этого:

$(e).find('unidadeid').each(function() { 
    countUnidades++; 
    var Unidade[value inside countUnidades here] = $(this).text(); 
}); 

иметь четкое представление о ваших шагов, пожалуйста. Я прошу не для решения, а для помощи, как для обучения. Спасибо;)

+1

Рассмотрите возможность использования [массивы] (HTTPS: //developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/Array). –

+1

Использование eval() не рекомендуется. не могли бы вы объяснить, почему вы хотите создавать переменные во время выполнения? вы можете использовать Массивы. – nandu

+0

Я не знаю, могу ли я использовать массивы. Благодарю. Мне не нравится спрашивать о stackoverflow. Из-за того, что меня отрицают, я чувствую себя как compltete noob. – ghaschel

ответ

8

У вас есть два варианта:

  1. использовать массив:

    var unidades = []; 
    $(e).find('unidadeid').each(function() { 
        unidades.push($(this).text()); 
    }); 
    

    или

    var unidades = $(e).find('unidadeid').map(function() { 
        return $(this).text(); 
    }).get(); 
    
  2. Если вы действительно, действительно хотите иметь имена, которые не только цифр, используйте объект и заключенные в квадратные скобки обозначения:

    var unidades = {}, countUnidades = 0; 
    $(e).find('unidadeid').each(function() { 
        countUnidades++ 
        unidades['Unidade' + countUnidades] = $(this).text(); 
    }); 
    

    Это создает объект, unidades, со свойствами, как Unidade0, Unidade1 и т.д. Обратите внимание, что each получает индекс, так что вам не нужно countUnidades, если вы не хотите что-то другое:

    var unidades = {}; 
    $(e).find('unidadeid').each(function (index) { 
        unidades['Unidade' + index] = $(this).text(); 
    }); 
    
+0

Я хочу использовать countUnidades для чего-то еще :) – ghaschel

+0

@ghaschel: :-) Ну, вот и вы. :-) В # 1 выше 'countUnidades'' 'unidades.length'. В # 2 первый пример имеет 'countUnidades'. –

5

Вы всегда можете использовать массив:

var Unidade = [], 
    countUnidades = 0; 

$(e).find("unidadeid").each(function(i) { 
    Unidade[countUnidades++] = $(this).text(); 

    // ... or Unidade.push($(this).text()); 
    // ... or Unidade[i] = $(this).text(); 
}); 

Не забывайте, что DOM элементы должны всегда иметь уникальные идентификаторы, поэтому each итерация здесь не требуется, если unidadeid относится к идентификатору некоторый элемент.

1

Я сомневаюсь, что вам нужно динамически создавать переменные. Это очень редко помогает.

Возможно, вы захотите узнать о структурах данных; в частности, я думаю, что вы просто хотите массив:

var unidades = []; // declare the array outside the loop 
$(e).find('unidadeid').each(function() { 
    countUnidades++; 
    unidades[countUnidades] = $(this).text(); 
}); 

И теперь у вас есть массив, unidades, значение которого является text() содержимым ваших элементов.

Я не уверен, что find('unidadeid') - это то, что вы хотите - это нахождение всех элементов <unidadeid>, который не является элементом HTML, но, возможно, вы обрабатываете пользовательский XML, или, может быть, это просто пример.

1

Ну, просто для полноты картины, вот именно то, что вы просили, Eventhough это страшная мысль:

$(e).find('unidadeid').each(function() { 
    countUnidades++; 
    var t = $(this).text(); 
    eval('Unidade' + countUnidades + ' = t;'); 
}); 

Примечание:

  • eval трудно использовать, не открывая дыры в безопасности.
  • eval является медленным.
  • Создание переменных динамически довольно бессмысленно, потому что вам также нужно динамически обращаться к ним.
  • Переменные глобальны (поскольку в противном случае они были бы локальны для функции обратного вызова и уходили сразу после создания).

Обычно используется массив вместо:

var Unidade = []; 
$(e).find('unidadeid').each(function() { 
    Unidade.push($(this).text()); 
}); 
2

Ваш пример просто добавить к тому, что я предполагаю, что это массив с возрастающими значениями. Unidade будет выглядеть примерно так в формате JSON:

[ 
    0: "text0", 
    1: "text1", 
    2: "text2" 
] 

Но если вы хотите добавить это к объекту, вы бы просто перебрать массив строк, где массив той же длины, что и в списке элементов. На самом деле вам может понадобиться привязать это значение к атрибуту data, где значением является имя переменной, а текст - это содержимое элемента. Таким образом, HTML будет выглядеть примерно так:

<div data-var="a">Text1</div> 
<div data-var="b">Text2</div> 
<div data-var="c">Text3</div> 

Потребует это JS:

var unidade = {}; 

$("div").find('unidadeid').each(function() { 
    unidade[$(this).data('var')] = $(this).text(); 
}); 

console.log(unidade); 

И объект будет выглядеть следующим образом:

{ 
    "a": "Text1", 
    "b": "Text2", 
    "c": "Text3" 
} 
Смежные вопросы