Najprostszy sposób sprawdzenia, czy klucz istnieje w obiekcie przy użyciu CoffeeScript

110

Jaki jest najprostszy sposób sprawdzenia, czy w obiekcie istnieje klucz w CoffeeScript?

ajsie
źródło

Odpowiedzi:

182
key of obj

To kompiluje się do JavaScript key in obj. (CoffeeScript używa ofprzy odwoływaniu się do kluczy i inprzy odwoływaniu się do wartości tablic: val in arrsprawdzi, czy valjest warr .)

Odpowiedź thejh jest poprawna, jeśli chcesz zignorować prototyp obiektu. Odpowiedź Jimmy'ego jest poprawna, jeśli chcesz zignorować klucze z wartością nulllub undefined.

Trevor Burnham
źródło
2
najprawdopodobniej own key of objdziała również do dodatkowych testów .hasOwnProperty(). „najprawdopodobniej” pochodzi ode mnie, nie próbowałem, ale ta składnia działa ze zrozumieniem.
latające owce
2
@flyingsheep Nie, działa tylko ze zrozumieniem. Wypróbuj: coffeescript.org/#try:own%20key%20of%20obj
Trevor Burnham
ah, ok :own = (prop, obj) -> Object::hasOwnProperty.call obj, prop
latająca owca
36

„?” operator sprawdza istnienie:

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
źródło
16
To kończy się niepowodzeniem, jeśli klucz istnieje, ale ma wartość null.
mu jest za krótkie
W przypadku, gdy nie obchodzi nas, że klucz istnieje, ale jest pusty, obj.key?jest prawdopodobnie najbardziej zwięzły.
Andrew Mao
21
obj.hasOwnProperty(name)

(aby zignorować dziedziczone właściwości)

thejh
źródło
Podoba mi się ta odpowiedź, ponieważ key of objzgłosi błąd, jeśli wartość jest ciągiem lub liczbą. Cannot use 'in' operator to search. W takim przypadku, jeśli obiekt nie jest niezdefiniowany i nie jest pusty, zadziała.
jqualls
Nie udaje się to, gdy obiekt ma wartość ze swojego prototypu.
Brian M. Hunt