Самый простой способ проверить, существует ли ключ в объекте, с помощью CoffeeScript


110

Каков самый простой способ в CoffeeScript проверить, существует ли ключ в объекте?

Ответы:


182
key of obj

Это компилируется в JavaScript key in obj. (CoffeeScript использует ofпри обращении к ключам и inпри обращении к значениям массива: val in arrпроверяет, valесть ли вход arr.)

Ответ thejh правильный, если вы хотите игнорировать прототип объекта. Ответ Джимми правильный, если вы хотите игнорировать ключи со значением nullили undefined.


2
скорее всего own key of objтоже работает, чтобы дополнительно протестировать .hasOwnProperty(). «скорее всего» исходит от того, что я не пробовал, но этот синтаксис работает в пониманиях.
— летающая овца

2
@flyingsheep Нет, это работает только в понимании. Попробуйте: coffeescript.org/#try:own%20key%20of%20obj
— Trevor Burnham

ах, хорошо :own = (prop, obj) -> Object::hasOwnProperty.call obj, prop
— летающая овца

36

'?' оператор проверяет наличие:

if obj?
    # object is not undefined or null

if obj.key?
    # obj.key is not undefined or null

# call function if it exists
obj.funcKey?()

# chain existence checks, returns undefined if failure at any level
grandChildVal = obj.key?.childKey?.grandChildKey

# chain existence checks with function, returns undefined if failure at any level
grandChildVal = obj.key?.childKey?().grandChildKey

16
Это не удается, если ключ есть, но имеет значение null.
— mu слишком короткое

В случае, когда никто не заботится о том, чтобы ключ существовал, но был нулевым, obj.key?это, вероятно, самый краткий.
— Эндрю Мао

21
obj.hasOwnProperty(name)

(игнорировать унаследованные свойства)


Мне нравится этот ответ, потому key of objчто выдает ошибку, если значение является строкой или числом. Cannot use 'in' operator to search. В этом случае, если объект не является неопределенным и не нулевым, он будет работать.
— jqualls

Это не удается, если объект имеет значение из своего прототипа.
— Брайан М. Хант
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.