Запишите нехватку оператора if-else с двумя падежами в одной строке

Существует выражение JavaScript, которое присваивает name переменная к renamed переменная. Это всегда то же самое с одним исключением:

renamed =  name == 'John' ? 'Johnny' : name;

Однако я хочу два исключения:

  1. переименовать Джона в Джонни
  2. переименовать Алекса в Александра
  3. Все остальные имена присваиваются без изменений.

Можно ли записать это выражение в одну строку?

renamed =  (name == 'John' || name == 'Alex') ? <____> : name;

Мне нужно, чтобы это было сделано в одну строку.

Спасибо.

3 ответа

Решение
(name === 'John' && 'Johny') || (name === 'Alex' && 'Alexander') || name;
  • Если name является Johnзатем он переходит к следующей части в && выражение и возврат Johny,

  • Если name является Alex, то подобное в первом случае возвращает Alexander,

  • Если ни один из них не соответствует действительности, верните name как есть.

демонстрация

Это решение работает, потому что в JavaScript && Оператор вычисляет выражение слева, и если оно ложно, то значение будет возвращено, а выражение правой части вообще не будет оцениваться.

Если выражение слева оценивается как Истина, тогда выражение справа будет оценено, и результат будет возвращен как есть. Например

console.log(1 && 2);
# 2
console.log(0 && 2);
# 0

Сначала оценивает 1правда это так 2 оценивается и возвращается значение. Вот почему он печатает 2,

Во втором случае 0 оценивается как ложь. Итак, он возвращается сразу. Вот почему он печатает 0,

Так же

console.log("John" && "Johny");
# Johny

John будет оцениваться как Истина и так Johny Также будут оценены и возвращены. Вот почему мы получаем Johny,

Согласно стандарту ECMA 5.1, истинность объекта будет определена в соответствии со следующей таблицей

+-----------------------------------------------------------------------+
| Argument Type | Result                                                |
|:--------------|------------------------------------------------------:|
| Undefined     | false                                                 |
|---------------|-------------------------------------------------------|
| Null          | false                                                 |
|---------------|-------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion). |
|---------------|-------------------------------------------------------|
| Number        | The result is false if the argument is +0, −0, or NaN;|
|               | otherwise the result is true.                         |
|---------------|-------------------------------------------------------|
| String        | The result is false if the argument is the empty      |
|               | String (its length is zero); otherwise the result is  |
|               | true.                                                 |
|---------------|-------------------------------------------------------|
| Object        | true                                                  |
+-----------------------------------------------------------------------+

Примечание: последняя строка, Object, который включает в себя как объекты, так и массивы.

renamed = (name == 'john') ? 'johney': (name == 'alex'? 'alexander' : name);

Вы можете попробовать это:

renamed = (name == 'John' ? 'Johnny' : (name == 'Alex' ? 'Alexander' : name));
Другие вопросы по тегам