установить переменную в переменную, которая уже существует на основе имени переменной

#javascript #jquery

#javascript #jquery

Вопрос:

Предположим, когда страница отображается, у меня есть переменная, которая выглядит как:

var test1 = 'this is a string of html'

У меня есть функция, которая выглядит как :

   function addRow(v) {
    $.each(v, function (k,v) {
      if (k == 'jsvar') {
        cableHTML = 'test1'
        insertCabling(parentId, cableHTML)
      }
    });
  }
  

переменная, значение которой cableHTML установлено, зависит от jsvar значения. Поэтому она будет меняться в зависимости от того, что выбрано.

test1 может быть test2 , или что-то еще. test1 / test2 / test3 и т.д., все они существуют как переменные на странице при ее загрузке. пара значений jsvar определяет, какой cableHTML должна быть переменная.

Я хочу установить cableHTML test переменные, которые были загружены ранее. Есть ли (надеюсь) простой способ добиться этого?

Комментарии:

1. пока она находится в области видимости… просто удалите кавычки вокруг test1. кроме того, вы понимаете, что создаете cableHTML глобальную переменную?

2. извините, я не включил важную информацию — test1 может быть test2 или что-то еще. Test1 / test2 / test3 и т.д., все они существуют как переменные на странице при ее загрузке. пара значений ‘jsvar’ определяет, какой должна быть переменная cableHTML

3. Похоже, вы должны использовать массив вместо нескольких индексированных имен переменных. Затем сделайте что-то вроде cableHTML = testArray[v];

4. Важный вопрос — откуда вы знаете, какую переменную вы хотите назначить? test1, test2 или test3?

5. я думаю, что смерни здесь прав…

Ответ №1:

Основываясь на том, что вы сказали «пара значений jsvar определяет, какой cableHTML должна быть переменная», предполагая, что это значение равно test1 test2 , и т.д. Вы могли бы сделать это:

   function addRow(v) {
    $.each(v, function (k,v) {
      if (k == 'jsvar') {
        cableHTML = eval("v");
        insertCabling(parentId, cableHTML)
      }
    });
  }
  

Но вам было бы лучше использовать массив ( eval() а имена индексированных переменных — это то, чего вы всегда должны избегать), и делать что-то вроде:

   function addRow(v) {
    $.each(v, function (k,v) {
      if (k == 'jsvar') {
        cableHTML = myArray[v];
        insertCabling(parentId, cableHTML)
      }
    });
  }
  

Где значение для jsvar — это ключ для элемента, который вы хотите в своем myArray массиве.

Кроме того, если вы не объявляете var cableHTML где-то еще в этой области, вы делаете ее глобальной переменной. Поскольку вы передаете ее в качестве параметра insertCabling() , я предполагаю, что вам не нужен / нужен глобальный, и вы должны просто добавить var в cableHTML = ...


Также, просмотрев ваш код подробнее, кажется each() , что это не нужно:

   function addRow(row) {
    if(row["jsvar"]){
      insertCabling(parentId, row["jsvar"]);
    }
  }
  

Комментарии:

1. Спасибо. это именно то, что мне было нужно. Я попытался создать массив .. но код, над которым я работаю, настолько старый и уродливый, что трудно сделать что-то лучше.

2. @RickyMason, я не уверен, видели ли вы, что я добавил к своему ответу (об удалении each() цикла). Если вы используете eval() (чего не следует), вы могли бы сделать что-то подобное вместо всего each() блока : try { (row["jsvar"] amp;amp; insertCabling(parentId, eval(row["jsvar"])));} catch (e) {} . также обратите внимание, что я изменил имя addRow() параметра на row .

3. Спасибо. Я работал над вашими предложенными изменениями, и теперь они отлично работают.

Ответ №2:

Вам нужно избавиться от кавычек вокруг test1 и jsvar в вашем коде, если только вы не хотите, чтобы k было равно строке 'jsvar' , и вы хотите, чтобы cableHTML был равен 'test' .

 var test1 = 'this is a string of html';

function addRow(v) {
  $.each(v, function(k,v) {
    if (k == jsvar) {
      cableHTML = test1
      insertCabling(parentId, cableHTML)
    }
  });
}