Czy to zadziała do testowania, czy istnieje wartość w pozycji „index”, czy też istnieje lepszy sposób:
if(arrayName[index]==""){
// do stuff
}
javascript
arrays
Ankur
źródło
źródło
Odpowiedzi:
Pod względem koncepcyjnym tablice w JavaScript zawierają
array.length
elementy, zaczynając odarray[0]
aż doarray[array.length - 1]
. Element tablicy z indeksemi
jest zdefiniowany jako część tablicy, jeślii
jest pomiędzy0
iarray.length - 1
obejmuje. Jeśli i nie znajduje się w tym zakresie, nie ma go w tablicy.Tak więc z założenia tablice są liniowe, zaczynając od zera i osiągając maksimum, bez żadnego mechanizmu mającego „przerwy” w tym zakresie, w którym nie ma żadnych wpisów. Aby dowiedzieć się, czy wartość istnieje przy danym indeksie pozycji (gdzie indeks wynosi 0 lub dodatnia liczba całkowita), dosłownie wystarczy użyć
Teraz, pod maską, silniki JavaScript prawie na pewno nie będą alokować przestrzeni tablic liniowo i przylegle w ten sposób, ponieważ nie miałoby to większego sensu w dynamicznym języku i byłoby nieefektywne dla pewnego kodu. Prawdopodobnie są to tabele skrótów lub hybrydowe połączenie strategii, a niezdefiniowanym zakresom tablicy prawdopodobnie nie przydzielono własnej pamięci. Niemniej jednak JavaScript język chce przedstawić tablice
array.length
n jako mające n członków i mają one nazwy od 0 do n - 1 , a wszystko w tym zakresie jest częścią tablicy.Jednak prawdopodobnie chcesz wiedzieć, czy wartość w tablicy jest rzeczywiście czymś zdefiniowanym - to znaczy nie jest
undefined
. Może nawet chcesz wiedzieć, czy to jest zdefiniowane, czy nienull
. Możliwe jest dodawanie członków do tablicy bez ustawiania ich wartości: na przykład, jeśli dodasz wartości tablicy przez zwiększeniearray.length
właściwości, będą to nowe wartościundefined
.Aby ustalić, czy dana wartość ma znaczenie, czy została zdefiniowana. To znaczy nie
undefined
lubnull
:lub
Co ciekawe, ze względu na reguły porównywania JavaScript, mój ostatni przykład można zoptymalizować do tego stopnia:
źródło
length
właściwość, w którym to przypadku dwa późniejsze przykłady są bardziej odpowiednie.foo !== 'undefined' && foo !== null
justfoo != null
0
doarray.length - 1
. Jednak nie wszystkie z tych wartości będą wartościami zdefiniowanymi . Jeśli użyjesz słowa kluczowego delete na elemencie tablicy, spowoduje to przywrócenie tego elementu do niezdefiniowanego, podobnie jak w przypadku rozszerzenia tablicy poprzez zwiększenie parametru array.length, nowe wartości zaczną się jako niezdefiniowane. W rzeczywistości implementacje JavaScript prawdopodobnie zoptymalizują pamięć macierzy, a niektóre lub wszystkie niezdefiniowane wartości mogą nie zajmować pamięci.new Array(1)[0] === undefined
ale wartość jest pusta.[undefined][0] === undefined
ale wartość jest ustawiona; tablica ma wartość. Jedynym idealna odpowiedź używain
albohasOwnProperty()
-idx in array
alboarray.hasOwnProperty(idx)
--per tę odpowiedź: stackoverflow.com/a/39171620/3120446Czy nie możemy tego po prostu zrobić:
źródło
if(arrayName.length) {...
jakąś różnicę?if(arrayName.length) {...
kończy się niepowodzeniemnull
[undefined, undefined]
tablica ma długość = 2.Używanie tylko
.length
nie jest bezpieczne i spowoduje błąd w niektórych przeglądarkach. Oto lepsze rozwiązanie:lub możemy użyć:
źródło
źródło
źródło
x == null
będzie prawdziwe tylko dla wartości zerowej lub niezdefiniowanej, nic więcej. Podobniex != null
będzie prawdziwe dla wszystkiego, co nie jest ani zerowe, ani niezdefiniowane. O ile nie musisz specjalnie szukać nieokreślonego, po prostu pochyl się nad ukrytą dobrocią konwersji.Krótkie i uniwersalne podejście
Jeśli chcesz sprawdzić dowolną tablicę, która ma wartości fałszowania (takie jak fałsz, niezdefiniowane, puste lub puste łańcuchy), możesz po prostu użyć każdej metody () :
Na przykład:
Jeśli potrzebujesz pierwszego indeksu wartości fałszowania, możesz to zrobić w następujący sposób:
Jeśli chcesz tylko sprawdzić wartość fałszowania tablicy dla danego indeksu, możesz to zrobić w następujący sposób:
źródło
Jeśli masz na myśli „Null” -> Jego elementy są zerowe lub równe „”, w tym przypadku: Sprawdź, czy tablica jest pusta po odfiltrowaniu wszystkich elementów „null”
Oczywiście, dodaj metodę Clean przed:
źródło
Poleciłbym utworzenie takiej funkcji:
Możesz to tak nazwać:
Zmuszenie programisty do przestrzegania interfejsu isEmptyEl spowoduje wyłapanie błędów wejściowych, takich jak niezdefiniowana nazwa tablicy lub zmienne indexVal.
(Ogólnie dobrą praktyką jest programowanie defensywne podczas programowania w JavaScript).
Wystąpiłby taki błąd, gdyby nie zdefiniowano arrayName:
Podobne wyniki dla niezdefiniowanego indexVal.
Błąd pojawia się, jeśli wartości tablicy lub indeksu nie istnieją.
Prawidłowe dane wejściowe są prawdziwe tylko wtedy, gdy nazwa_kolekcji [indexVal] jest jedną z następujących czynności:
źródło
To zależy od tego, co masz na myśli przez „pusty”.
Gdy spróbujesz uzyskać wartość właściwości obiektu, który nie ma właściwości o tej nazwie, otrzymasz wartość
undefined
.Tak dzieje się z rzadkimi tablicami: nie wszystkie wskaźniki pomiędzy
0
iarray.length-1
istnieją.Więc możesz sprawdzić, czy
array[index] === undefined
.Jednak właściwość
index
może istnieć zundefined
wartością. Jeśli chcesz odfiltrować ten przypadek, możesz użyćin
operatora lubhasOwnProperty
, jak opisano w Jak sprawdzić, czy obiekt ma właściwość w JavaScript?Jeśli chcesz uznać, że istniejąca właściwość z wartością
undefined
lubnull
nie istnieje, możesz użyć luźnego porównaniaarray[index] == undefined
lubarray[index] == null
.Jeśli wiesz, że tablica nie jest rzadki, można porównać
index
zarray.length
. Ale dla bezpieczeństwa możesz chcieć upewnić się, żeindex
tak naprawdę jest to indeks tablicy, zobacz Sprawdź, czy nazwa właściwości to indeks tablicyźródło
OK, najpierw zobaczmy, co by się stało, gdyby wartość tablicy nie istniała w JavaScript, więc jeśli mamy tablicę jak poniżej:
a teraz sprawdzamy, czy 6 ma indeks 5, czy nie:
i dostajemy
undefined
...To w zasadzie daje nam odpowiedź, najlepszy sposób sprawdzenia, czy jest niezdefiniowany, więc coś takiego:
Lepiej NIE rób tego w tym przypadku:
Wyobraź sobie, że mamy tę tablicę:
a my:
Jak widać, nawet 0 jest tam, nie można ich rozpoznać, jest kilka innych rzeczy, które mogą zrobić to samo i spowodować, że aplikacja będzie działać nieprawidłowo, więc bądź ostrożny, wymienię je wszystkie w dół:
undefined
''
źródło
Chciałbym zwrócić uwagę na coś, co niektórym wydaje się przeoczyć: mianowicie możliwe jest umieszczenie „pustej” pozycji tablicy na środku tablicy. Rozważ następujące:
Naturalnym sposobem sprawdzenia byłoby wtedy sprawdzenie, czy element tablicy nie jest zdefiniowany, nie jestem pewien, czy istnieją inne sposoby
źródło
spróbuj tego, jeśli tablica [indeks] ma wartość NULL
źródło
Z Lodash możesz:
if(_.has(req,'documents'))
jest sprawdzenie, czy nasz obiekt żądania ma właściwość o nazwie,documents
a jeśli ma tę prop, następnąif (req.documents.length)
jest sprawdzenie, czy nie jest to pusta tablica, abyforEach
można było wykonać inne czynności.źródło
Aby sprawdzić, czy nigdy nie został zdefiniowany lub czy został usunięty:
działa również z tablicami asocjacyjnymi i tablicami, w których usunięto niektóre indeksy
Aby sprawdzić, czy nigdy nie został zdefiniowany, został usunięty LUB jest pustą lub logicznie pustą wartością (NaN, pusty ciąg, fałsz):
źródło
Natknąłem się na ten problem przy użyciu danych laravel. Przechowywałem wartość JSON wywoływaną
properties
w dzienniku aktywności i chciałem wyświetlić przycisk oparty na tej wartości, która jest pusta lub nie.Cóż, bazy danych interpretowały to jako tablicę, jeśli była pusta, a obiekt, jeśli nie był, dlatego następujące rozwiązanie działało dla mnie:
Obiekt nie ma właściwości length.
źródło
Myślę, że ta decyzja jest odpowiednia dla facetów, którzy wolą deklaratywne programowanie funkcjonalne niż imperatywny OOP lub proceduralny. Jeśli twoje pytanie brzmi: „ Czy w środku są jakieś wartości? (Prawda lub fałsz)?” Możesz użyć
.some
metody, aby sprawdzić wartości w środku.function isEmpty(arr) { ... }
.[].length
co0
w niektórych przypadkach jest niebezpieczne.[].length > 0
powiedzenie „Czy jego długość jest większa od zera?”Zaawansowane przykłady:
źródło
Możesz użyć biblioteki Loadsh, aby zrobić to bardziej wydajnie, na przykład:
jeśli masz tablicę o nazwie „zwierzaki”, na przykład:
Aby sprawdzić wszystkie wartości tablic pod kątem wartości pustych lub niezdefiniowanych:
Sprawdź więcej przykładów w http://underscorejs.org/
źródło
fn(){}
jest błędem składniowym i wcale nie jest jasne, w jaki sposób pomaga to sprawdzić, czy element tablicy istnieje pod określonym indeksem, czy nie.