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


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.


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

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)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.