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?

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.


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

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)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.