La forma más sencilla de verificar si la clave existe en el objeto usando CoffeeScript

110

En CoffeeScript, ¿cuál es la forma más sencilla de comprobar si existe una clave en un objeto?

ajsie
fuente

Respuestas:

182
key of obj

Esto se compila a JavaScript key in obj. (CoffeeScript usa ofcuando se refiere a claves, y incuando se refiere a valores de matriz: val in arrprobará si valestá dentro arr)

La respuesta de thejh es correcta si desea ignorar el prototipo del objeto. La respuesta de Jimmy es correcta si desea ignorar las claves con un valor nullo undefined.

Trevor Burnham
fuente
2
lo más probable es que también own key of objfuncione para probar adicionalmente .hasOwnProperty(). lo “más probable” viene de que yo no lo haya intentado, pero esta sintaxis funciona en comprensiones.
oveja voladora
2
@flyingsheep No, solo funciona en comprensiones. Pruébelo: coffeescript.org/#try:own%20key%20of%20obj
Trevor Burnham
ah, ok :own = (prop, obj) -> Object::hasOwnProperty.call obj, prop
oveja voladora
36

Los '?' el operador comprueba la existencia:

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
fuente
16
Esto falla si la clave está ahí pero tiene un valor de null.
mu es demasiado corto
En el caso de que a uno no le importe que la clave exista pero sea nula, obj.key?probablemente sea la más concisa.
Andrew Mao
21
obj.hasOwnProperty(name)

(ignorar propiedades heredadas) a.

thejh
fuente
Me gusta esta respuesta porque key of objarrojará un error si el valor es una cadena o un número. Cannot use 'in' operator to search. En este caso, si el objeto no está indefinido y no es nulo, funcionará.
jqualls
Esto falla cuando el objeto tiene el valor de su prototipo.
Brian M. Hunt