Как я могу обновить значение объекта, которое использует шаблонный литерал в javascript?

Для этого нет единственного решения (ну, есть eval, но не стоит серьезно относиться к этому). Доступ к глобальным переменным возможен динамически через window, но это не работает для переменных, локальных для функции.

Почти всегда есть лучшее решение, чем использование переменных переменных! Вместо этого вы должны смотреть на структуры данных и выбирать правильную для своей проблемы.

Если у вас есть фиксированный набор имен, например

// BAD
var foo = 42;
var bar = 21;

var key = 'foo';
console.log(eval(key));

сохранить эти имена / значения в качестве свойств объекта и использовать нотацию скобки для динамического поиска:

// GOOD
var obj = {
  foo: 42,
  bar: 21,
};

var key = 'foo';
console.log(obj[key]);

Если у вас есть «последовательные» нумерованные переменные, такие как

// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

var index = 1;
console.log(eval('foo' + index));

, тогда вы должны использовать массив и просто использовать индекс для доступа к соответствующему значению:

// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);

0
задан Aditya Earanky 13 July 2018 в 16:08
поделиться

1 ответ

Вы не можете, литерал шаблона был оценен и преобразован в строку, когда инициализатор объекта, который был внутри, был оценен. obj.title - результат вычисления литерала шаблона (строка 1), а не какого-либо объекта шаблона. Литералы шаблонов - это именно то, что: литеральная нотация , которая оценивается, когда она встречается (точно так же, как строковый литерал оценивается, в результате получается строка, когда встречается литерал строки) .

Вместо этого вы можете сделать title функцию, которую вы передаете name в:

let obj1 = { name: 'abc' }, 
obj2 = { title : name => `${name}` } 

Вы должны называть ее, конечно, когда захотите заголовок.


¹ Строка в этом случае , поскольку шаблонный литерал был автономным, не привязан к функции тега.

4
ответ дан T.J. Crowder 17 August 2018 в 12:26
поделиться
  • 1
    (Ошибка редактирования. Если вы видите ${obj1.name} вместо ${name} выше, нажмите «Обновить».) – T.J. Crowder 13 July 2018 в 16:14
Другие вопросы по тегам:

Похожие вопросы: