Ответ 1
Если вам не нужна точная семантика CoffeeScript, вы можете немного обмануть:
return item.getFoo ? (item.getFoo().fooParam || {}).bar : undefined;
Здесь есть несколько трюков.
- Тернарный оператор используется для проверки правдоподобности
item.getFoo
- Если
fooParam
отсутствует, ложно или отсутствует, мы заменяем его пустым объектом. CoffeeScript вылетел бы здесь. - Мы возвращаем значение
bar
независимо от того, существует ли оно. Если он существует, вы получаете нужное значение. Если он не существует, ноfooParam
установлен, вы получаетеundefined
. Если он не существует, потому чтоfooParam
был undefined, и мы вернулись к{}
, вы все равно получитеundefined
.
Вы можете написать некоторые помощники, если троичный оператор мешает:
function defaultObject(input) { // A helper to put somewhere
return input || {};
}
return defaultObject((item.getFoo || defaultObject)().fooParam).bar;
Это даже сложнее: defaultObject
будет возвращать {}
при вызове с getFoo
, поэтому вам не нужен тройной оператор вокруг вызова функции. Если fooParam
не является правдивым, defaultObject
возвращает другой пустой объект, исключая необходимость в другом ||
. Если fooParam
является правдивым, defaultObject
ведет себя как функция идентификации и возвращает его.
Я уверен, что это можно было бы сыграть в гольф дальше, но я бы рекомендовал избежать этой картины. Любой, кто читает ваш код, будет довольно запутанным и обвинит вас в том, что вы делаете беспорядок в кодовой базе.