Jak sprawdzić, czy określony klucz istnieje w obiekcie lub tablicy JavaScript?
Jeśli klucz nie istnieje i spróbuję uzyskać do niego dostęp, czy zwróci wartość false? Lub rzucić błąd?
javascript
arrays
object
Adam Ernst
źródło
źródło
property.key = property.key || 'some default value'
Odpowiedzi:
Sprawdzanie niezdefiniowanej nie jest dokładnym sposobem sprawdzenia, czy klucz istnieje. Co jeśli klucz istnieje, ale wartość jest rzeczywiście
undefined
?Zamiast tego powinieneś użyć
in
operatora:Jeśli chcesz sprawdzić, czy klucz nie istnieje, pamiętaj o użyciu nawiasu:
Lub jeśli chcesz szczególnie przetestować właściwości instancji obiektu (a nie właściwości dziedziczone), użyj
hasOwnProperty
:Dla porównania wydajności między metodami, które są
in
,hasOwnProperty
a kluczem jestundefined
, zobacz ten wzorzecźródło
szybka odpowiedź
Bezpośredni dostęp do brakującej właściwości za pomocą (asocjacyjnego) stylu tablicy lub stylu obiektu zwróci niezdefiniowaną stałą.
Powolne i niezawodne w operatora i hasOwnProperty Sposób
Jak już wspomniano tutaj, możesz mieć obiekt o właściwości powiązanej z „niezdefiniowaną” stałą.
W takim przypadku trzeba będzie używać hasOwnProperty lub w operatora wiedzieć, czy klucz jest naprawdę istnieje. Ale, ale za jaką cenę?
więc mówię ci ...
w operator i hasOwnProperty są „metodami”, które wykorzystują mechanizm deskryptora właściwości w Javascript (podobny do odbicie Java w języku Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Z drugiej strony wywołanie metody obiektu lub klucza spowoduje użycie mechanizmu Javascript [[Get]]. To jest o wiele szybsze!
reper
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Korzystanie z operatoraWynik był
Korzystanie z hasOwnPropertyWynik był
Bezpośredni dostęp do elementów (styl nawiasów)Wynik był
Bezpośredni dostęp do elementów (styl obiektu)Wynik był
EDYCJA: Jaki jest powód przypisania do właściwości
undefined
wartości?To pytanie mnie zastanawia. W Javascripcie istnieją co najmniej dwa odwołania do nieobecnych obiektów, aby uniknąć takich problemów:
null
iundefined
.null
jest pierwotną wartością, która reprezentuje celowy brak jakiejkolwiek wartości obiektu, lub w skrócie potwierdzony brak wartości. Z drugiej strony,undefined
wartość nieznana (nie zdefiniowana). Jeśli istnieje właściwość, która zostanie użyta później z odpowiednią wartością, rozważ użycienull
odwołania zamiast,undefined
ponieważ w początkowej chwili potwierdzono, że właściwość nie ma wartości.Porównać:
Doradzać
Unikaj obiektów z
undefined
wartościami. Sprawdź bezpośrednio, gdy tylko jest to możliwe, i użyj,null
aby zainicjować wartości właściwości. W przeciwnym razie użyj powolnegoin
operatora lubhasOwnProperty()
metody.EDYCJA: 12.04.2018 - NIE JEST ODPOWIEDNIE
Jak ludzie skomentowali, nowoczesne wersje silników JavaScript (z wyjątkiem Firefoxa) zmieniły podejście do właściwości dostępu. Bieżąca implementacja jest wolniejsza niż poprzednia w tym konkretnym przypadku, ale różnice między kluczem dostępu a obiektem są pomijalne.
źródło
delete hash[key]
jest on znacznie wolniejszy niżhash[key] = undefined
. Oczywiście w tym przypadku nie ma potrzeby potrzebowaćin
operatora, ale działa on jako kontrprzykład na „zawsze należy unikać ustawiania wartości na niezdefiniowaną”.Wróci
undefined
.undefined
jest specjalną stałą wartością. Możesz więc powiedzieć npJest to prawdopodobnie najlepszy sposób na sprawdzenie brakujących kluczy. Jednak, jak wskazano w komentarzu poniżej, teoretycznie możliwe jest, że chcesz mieć rzeczywistą wartość
undefined
. Nigdy nie musiałem tego robić i nie mogę wymyślić żadnego powodu, dla którego kiedykolwiek bym tego chciał, ale ze względu na kompletność możesz użyćin
operatoraźródło
var undefined = 42;
. Podczas testowania niezdefiniowanych rekwizytów należy zawsze używać((typeof variable) === "undefined")
.undefined
nie jest własnością do zapisu zgodnie ze specyfikacją ecma-international.org/ecma-262/5.1/#sec-15.1.1.3Odpowiedź Zaakceptowany odnosi się do obiektu . Strzeż się za pomocą
in
operatora na tablicy znaleźć dane zamiast klawiszy:Aby przetestować istniejące elementy w tablicy: Najlepszy sposób na sprawdzenie, czy element znajduje się w tablicy JavaScript?
źródło
Prawdopodobnie testuje tylko wartości atrybutów obiektu, które bardzo różnią się od kluczy tablicy
źródło
Trzy sposoby sprawdzenia, czy właściwość jest obecna w obiekcie javascript:
Konwertuje wartość na bool. zwraca PRAWDA dla wszystkich oprócz wartości „fałsz”
true, jeśli właściwość istnieje, bez względu na jej wartość (nawet pusta)
Nie sprawdza łańcucha prototypów. (ponieważ wszystkie obiekty mają metodę „toString”, 1 i 2 zwrócą na niej wartość true, a 3 może zwrócić na niej wartość false).
Odniesienie:
źródło
var a = {a : undefined, b : null}; !!a.a **will return false**
Jeśli używasz biblioteki underscore.js, operacje na obiektach / tablicach stają się proste.
W twoim przypadku można zastosować metodę _. Przykład:
zwraca true
Ale,
zwraca false
źródło
Odpowiedź:
Wyjaśnienie:
in
Operator sprawdzi, czy klucz istnieje w obiekcie. Jeśli sprawdziłeś, czy wartość była niezdefiniowana:if (myObj["key"] === 'undefined')
możesz napotkać problemy, ponieważ w obiekcie może istnieć klucz zundefined
wartością.Z tego powodu dużo lepszą praktyką jest najpierw użycie
in
operatora, a następnie porównanie wartości znajdującej się w kluczu, gdy już wiesz, że on istnieje.źródło
Oto funkcja pomocnika, którą uważam za całkiem przydatną
To
keyExists(key, search)
może być używany do łatwo odszukać klucz wewnątrz obiektów lub tablic!Po prostu przekaż mu klucz, który chcesz znaleźć, i wyszukaj obiekt obj (obiekt lub tablicę), w którym chcesz go znaleźć.
Jest dość niezawodny i działa dobrze w różnych przeglądarkach.
źródło
Array.indexOf
metody? (to znaczy jeśli szukasz wartości)vanila js
Jeśli chcesz sprawdzić, czy obiekt ma co najmniej jedną właściwość w es2015
źródło
Rozwiązanie ES6
za pomocą
Array#some
iObject.keys
. Zwróci wartość true, jeśli dany klucz istnieje w obiekcie, lub false, jeśli nie istnieje.Przykład jednowierszowy.
źródło
Możemy użyć -
hasOwnProperty.call(obj, key);
Sposób underscore.js -
źródło
Najłatwiejszym sposobem sprawdzenia jest
na przykład:
Zwracana wartość jako prawda oznacza, że klucz istnieje w obiekcie.
źródło
Dla tych, którzy wzięli
lodash
udział w projekcie:Istnieje metoda lodash _.get , która próbuje uzyskać „głębokie” klucze:
To skutecznie sprawdzi, czy ten klucz, jakkolwiek głęboki , jest zdefiniowany i nie wyrzuci błędu, który mógłby zaszkodzić przepływowi twojego programu, jeśli ten klucz nie zostanie zdefiniowany.
źródło
Chociaż nie musi to sprawdzać, czy klucz istnieje, sprawdza prawdziwość wartości. Które
undefined
inull
należą do.Boolean(obj.foo)
To rozwiązanie działa najlepiej dla mnie, ponieważ używam maszynopisu, a użycie takich ciągów znaków
'foo' in obj
lubobj.hasOwnProperty('foo')
sprawdzenie, czy klucz istnieje, czy nie, nie zapewnia mi inteligencji.źródło
Jeśli chcesz sprawdzić dowolny klucz na dowolnej głębokości obiektu i uwzględnić wartości falsey, rozważ ten wiersz funkcji funkcji:
Wyniki
Zobacz także ten pakiet NPM: https://www.npmjs.com/package/has-deep-value
źródło
źródło
W świecie „tablicowym” indeksy możemy traktować jak pewien rodzaj kluczy. Co zaskakujące,
in
operator (który jest dobrym wyborem dla obiektu) działa również z tablicami. Zwrócona wartość nieistniejącego klucza toundefined
źródło
yourArray.indexOf (yourArrayKeyName)> -1
prawdziwe
fałszywe
źródło
Te przykłady mogą wykazać różnice między różnymi sposobami. Mam nadzieję, że pomoże Ci wybrać odpowiedni dla swoich potrzeb:
źródło
Nowe niesamowite rozwiązanie z JavaScript Destrukturyzacją :
Sprawdź inne użycie JavaScript Destrukturyzacja
źródło