#javascript
#javascript
Вопрос:
У меня есть функция, которая возвращает значение, содержащее массив, а внутри массива находится объект data, к значению которого я хочу получить доступ.
Прямо сейчас, что я делаю, это
let budgets = await this.getReferenced(wipDocStore, facebookAdData, 'budget')
budgets = budgets[0].data
Но я не уверен, что это аккуратный способ или что люди обычно делают.
Будучи новичком в JavaScript, я подумал, что что-то подобное будет эквивалентно приведенному выше коду
let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data
но это не так (почему?). Другая вещь, которую я могу сделать, это напрямую вернуть соответствующие данные в getReference
функцию, но поскольку это функция многократного использования, мне не всегда нужны данные в 0-й позиции массива.
В общем, опытный программист также разбил бы приведенный выше код на две части
let budgets = await this.getReference(DocStore, AdData, 'budget')
budgets = budgets[0].data
если они не могут изменить this.getReference
функцию? кроме того, почему это не работает?
let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data
Комментарии:
1. Может быть проблема с приоритетом.
(await this.getReference(DocStore, AdData, 'budget'))[0].data
Допустимый синтаксис JavaScript?2. В качестве альтернативы, деструктурирование:
let [{ data: budgets }] = await this.getReference(DocStore, AdData, 'budget')
Ответ №1:
Забудьте все, что, по вашему мнению, вы хотели узнать о «аккуратных трюках».
- Не объявляйте переменную только для того, чтобы переназначить ее на что-то другое совершенно другого типа в следующей строке. Это запах кода, и в таких языках, как TypeScript, это большой запрет, потому что это нарушает безопасность типов и затрудняет оптимизацию движка.
- Если вам трудно прочитать инструкцию, это потому, что ее нужно разбить на более простые инструкции, а не сжимать в меньшую, более трудную для чтения инструкцию.
Имея это в виду, рассмотрим следующее:
const reference = await this.getReference(DocStore, AdData, 'budget')
const budgets = reference[0].data
В этом нет двусмысленности, и он четко передает, что делается, шаг за шагом. Вы await
указываете ссылку, затем получаете данные из первой записи в ссылочном массиве. Кроме того, приятно иметь const
объявление, поскольку вы можете сразу заключить, что значения никогда не будут переназначены по мере чтения кода.
Это также хорошо для оптимизации, потому что использование постоянной ссылки может уменьшить количество вызовов для распаковки ее значения в базовом движке, поскольку оно останется того же типа и той же ссылки в течение всего срока службы.
Ответ №2:
Подумайте о двусмысленности. Вы await
редактируете this.getReferenced(...)
или this....data
? Чтобы напрямую разыменовать результат, вам нужно очистить его с помощью круглых скобок:
let budgets = (await this.getReference(DocStore, AdData, 'budget'))[0].data;
Действительно ли это более читабельно, чем разбивать его на две строки, вы решаете сами.
Комментарии:
1. Не могли бы вы также
let [{ data: budgets }] =
использовать LHS?
Ответ №3:
const budgets = await this.getReferenced(wipDocStore, facebookAdData, 'budget').then(results => results[0].data)
Комментарии:
1. Если идти по этому пути, потенциально
const budgets = await this.getReference(wipDocStore, facebookAdData, 'budget').then(([{ data }]) => data)
может сработать.
Ответ №4:
Вы могли бы сделать
let budgets = (await this.getReference(DocStore, AdData, 'budget'))[0].data;
Но если вам нужен только атрибут data
, то это другой вариант:
let {data} = (await this.getReference(DocStore, AdData, 'budget'))[0]
Обертывание data
в круглых скобках означает, что вы хотите получить только атрибут с именем data
.
Но, чтобы сделать его более читаемым, по моему мнению, это был бы лучший вариант:
let budgets = await this.getReference(DocStore, AdData, 'budget');
let {data} = budgets[0];
Ответ №5:
Если вы посмотрите на:
Вы увидите, что ключевое слово await будет ожидать выполнения или отклонения обещания. Или немедленно верните значение, если вы не передаете обещание.
Итак, у вас есть два варианта: передача обещания или значения в качестве выражения, поскольку await ожидает выражение.
Здесь:
let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data
Поскольку ожидается выражение, это выражение будет вычислено первым, и поэтому возвращаемое значение не определено, поскольку вы обращаетесь к функции с индексом 0.
И, как указано в правилах, если вы передадите значение ключевому слову await, оно немедленно вернет это значение.