Есть ли более чистый способ добиться этого?
const message = `Error message: ${json.email ? json.email[0] : ''}`
@Alex, извините, я неправильно спросил, но я специально спрашивал об использовании логических операторов JavaScript, не обязательно лучший способ достижения.
@Alex отредактировал вопрос.
@AliAnkarali, не беспокойтесь, можно спросить об этом здесь :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать ||, как показано ниже
(arr || [''])[0]
Если arr - это ложь, то используется новый массив с пустой строкой в качестве первого элемента. [0] вернет первый элемент массива.
Спасибо, я не знал, что смогу так его использовать. Будет отмечен как принятый после окончания таймера.
Меня беспокоит лишь побочный вопрос ... разве это не неправильная идея? Я имею в виду, что если arr определен, но у него нет содержимого, он все равно будет возвращать undefined, как бы игнорируя цель пустой строки.
@Lain True. Но это то, что делает OP. Я предоставил альтернативу коду OP.
Да, я в курсе. Просто вопрос, может быть, ОП переосмыслил свою идею. Не сказать, что ваш ответ неправильный :-)
@Ali Ankarali: Что ж, интересно, действительно ли вы хотите вернуть undefined, если в массиве нет содержимого (var arr = []; console.info (1, (arr || ['']) [0])) и только пустую строку, если сам массив не определен (var arr = undefined; console.info (1, (arr || ['']) [0])). Я хотел бы иметь либо неопределенную, либо пустую строку в обоих случаях.
Ах, в моем случае, если есть массив, он никогда не бывает пустым. Однако, допустим, это может быть, тогда я хотел бы вернуть пустую строку.
На самом деле есть предложение tc39 по этому поводу: необязательная цепочка. После того, как это будет жить, это будет так просто, как
const message = `Error message: ${json?.email?.[0] || ''} ${json?.password?.[0] || ''} ${json?.username?.[0] || ''}`
«Этап 1» означает «похоже, что он находится в процессе обсуждения». Вы можете использовать такой синтаксис с помощью Babel.
В противном случае (без Babel) вам лучше использовать помощник, например _.get из lodash, или написать свою собственную версию. Почему не использовать тернарный оператор? Из-за плохой читабельности.
Вау, выглядит круто, спасибо. Я использую некоторые функции этапа 1, поэтому могу добавить эту.
Когда вы используете тернарную операцию, всегда возвращайте значение. Логические операторы следует использовать с осторожностью.
As logical expressions are evaluated from left to right, they are tested for possible "short-circuit" evaluation using the following rules:
Если вы используете lodash, вы можете использовать _.get метод, который позволяет вам указать весь путь вложенных средств доступа к свойствам, и если какое-либо свойство по пути не найдено, оно может дополнительно вернуть значение по умолчанию:
_.get(json, 'password[0]', '');
Итак, ваш пример будет примерно таким:
const message = `Error message: ${_.get(json, 'email[0]', '')} ${_.get(json, 'password[0]', '')} ${_.get(json, 'username[0]', '')}`
Можно сделать
(json.email || [''])[0].