Запишите нехватку оператора if-else с двумя падежами в одной строке
Существует выражение JavaScript, которое присваивает name
переменная к renamed
переменная. Это всегда то же самое с одним исключением:
renamed = name == 'John' ? 'Johnny' : name;
Однако я хочу два исключения:
- переименовать Джона в Джонни
- переименовать Алекса в Александра
- Все остальные имена присваиваются без изменений.
Можно ли записать это выражение в одну строку?
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));