Maneira mais simples de verificar se a chave existe no objeto usando CoffeeScript

110

No CoffeeScript, qual é a maneira mais simples de verificar se existe uma chave em um objeto?

ajsie
fonte

Respostas:

182
key of obj

Compila para o JavaScript key in obj. (CoffeeScript usa ofquando se refere a chaves, e inquando se refere a valores de array: val in arrtestará se valestá dentro arr)

a resposta do jh está correta se você deseja ignorar o protótipo do objeto. A resposta de Jimmy está correta se você deseja ignorar as chaves com um valor nullou undefined.

Trevor Burnham
fonte
2
muito provavelmente own key of objfunciona também para testar adicionalmente .hasOwnProperty(). o “mais provável” vem de eu não ter tentado, mas essa sintaxe funcionando nas compreensões.
ovelhas voadoras
2
@flyingsheep Não, só funciona em compreensões. Experimente: coffeescript.org/#try:own%20key%20of%20obj
Trevor Burnham
ah, ok :own = (prop, obj) -> Object::hasOwnProperty.call obj, prop
ovelhas voadoras de
36

O '?' operador verifica a existência:

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
limscoder
fonte
16
Isso falhará se a chave estiver lá, mas tiver um valor de null.
mu é muito curto
No caso em que não se importa se a chave existe, mas é nula, então obj.key?provavelmente é o mais conciso.
Andrew Mao
21
obj.hasOwnProperty(name)

(para ignorar propriedades herdadas)

thejh
fonte
Eu gosto dessa resposta porque key of objvai gerar um erro se o valor for uma string ou um número. Cannot use 'in' operator to search. Nesse caso, se o objeto não for indefinido e não for nulo, ele funcionará.
jqualls
Isso falha onde o objeto tem o valor de seu protótipo.
Brian M. Hunt