Próbuję napisać funkcję, która akceptuje listę ciągów lub pojedynczy ciąg. Jeśli jest to ciąg, to chcę przekonwertować go na tablicę za pomocą tylko jednego elementu, aby móc go zapętlać bez obawy o błąd.
Jak więc sprawdzić, czy zmienna jest tablicą?
Zaokrągliłem różne rozwiązania poniżej i stworzyłem test jsperf . Wszystkie są szybkie, więc po prostu użyj Array.isArray
- jest teraz dobrze obsługiwane i działa w różnych ramkach .
arr.constructor === Array
jest najszybszy.arr.constructor === Array
test zwróci wartość false.Array.isArray(arr)
wciąż jednak zwraca prawdę.Odpowiedzi:
W nowoczesnych przeglądarkach możesz to zrobić
( Obsługiwane przez Chrome 5, Firefox 4.0, IE 9, Opera 10.5 i Safari 5)
Dla kompatybilności wstecznej możesz dodać następujące elementy
Jeśli używasz jQuery, możesz użyć
jQuery.isArray(obj)
lub$.isArray(obj)
. Jeśli używasz podkreślenia, możesz użyć_.isArray(obj)
Jeśli nie musisz wykrywać tablic utworzonych w różnych ramkach, możesz także użyć
instanceof
źródło
Array.isArray
if (typeof Array.isArray === 'undefined') {
można zmienić naif(!Array.isArray) {
Object.prototype.string.call(obj)
można sfałszować, jeśli obiekt maSymbol.toStringTag
na sobie. To powiedziawszy, nie jestem świadomy żadnego środowiska, które jest statkiem,Symbol.toStringTag
ale nieArray.isArray
wydaje się to bezpieczne.instanceof Array
zawodzi, jeśli tablica pochodzi z innej ramki?instanceof Array
kończy się niepowodzeniem, jeśli tablica pochodzi z innej ramki, ponieważ każda tablica z tej innej ramki ma innyArray
konstruktor i prototyp. Ze względów kompatybilności / bezpieczeństwa każda ramka ma swoje własne globalne środowisko, w tym obiekty globalne.Object
Globalna z jednej ramki różni się odObject
globalnej od drugiego. To samo dotyczyArray
globaliów. Axel Rauschmayer mówi o tym więcej .Metodą podaną w standardzie ECMAScript w celu znalezienia klasy Object jest użycie
toString
metody zObject.prototype
.Możesz też użyć
typeof
do sprawdzenia, czy jest to ciąg znaków:Lub jeśli nie martwisz się wydajnością, możesz po prostu zrobić
concat
nową pustą macierz.Istnieje również konstruktor, do którego możesz bezpośrednio zapytać:
Sprawdź na dokładną obróbkę z @TJ Crowder na blogu, jak pisał w swoim komentarzu poniżej.
Sprawdź ten test porównawczy, aby dowiedzieć się, która metoda działa lepiej: http://jsben.ch/#/QgYAV
Z @Bharath przekonwertuj ciąg znaków na tablicę za pomocą Es6 dla zadanego pytania:
przypuszczać:
źródło
toString
to jeden ze sposobów. Robię trochę podsumowania tutaj: blog.niftysnippets.org/2010/09/say-what.htmltypeof new String('beans')
> „obiekt”Array.isArray(obj)
Najpierw sprawdzę, czy Twoja implementacja obsługuje
isArray
:Możesz także spróbować użyć
instanceof
operatoraźródło
v instanceof Array
zwróci false, jeśliv
został utworzony w innej ramce (v
jest instancjąthatFrame.contentWindow.Array
klasy).Array.isArray
jest zdefiniowany jako część ECMAScript 5 / Javascript 1.8.5.return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
jQuery oferuje również
$.isArray()
metodę:źródło
$.isArray === Array.isArray
powraca prawda.Array.isArray
za kulisami: github.com/jquery/jquery/blob/master/src/core.js#L211Jest to najszybszy spośród wszystkich metod (obsługiwane wszystkie przeglądarki):
źródło
if (obj && Array === obj.constructor)
w przeciwieństwie doif (obj && obj.constructor === Array)
? Czy to zagubione w tłumaczeniu na angielski, a potem na kodowanie? np. anglojęzyczni zwykle pytają „czy obiekt istnieje i czy jego konstruktor pochodzi z klasy tablicy?”, więc przepływ kodu podczas czytania jest bardziej logiczny. czy jest jakiś techniczny powód?function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
Wyobraź sobie, że masz tę tablicę poniżej :
JavaScript (nowe i starsze przeglądarki):
lub
lub
nazwij to tak:
JavaScript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)
jQuery:
Kątowy:
Podkreślenie i Lodash:
źródło
Array.isArray działa szybko, ale nie jest obsługiwany przez wszystkie wersje przeglądarek. Możesz zrobić wyjątek dla innych i zastosować uniwersalną metodę:
źródło
.toString()
metodę zObject.prototype
. Teraz używaszwindow.toString()
, co nie jest takie samo.window.toString
rób to samo coObject.prototype.toString
tylko w Chrome.Prosta funkcja, aby to sprawdzić:
źródło
return object.constructor === Array
- ale czy jesteś pewien, że to zwróci się tylko dla tablic?if(x) return true; else return false
:-) Nawet jeśli jest to odwrócone, powinieneś zanegować wyrażenie.Jak mówi tutaj MDN :
Lubię to:
Object.prototype.toString.call(arr) === '[object Array]'
lubArray.isArray(arr)
źródło
Jest tylko jedno rozwiązanie liniowe dla tego pytania
gdzie x jest zmienną, zwróci true, jeśli x jest tablicą, a false, jeśli nie jest.
źródło
typeof
porównanie.{}
tablica, to pojawia się błąd składniowy.Możesz sprawdzić typ swojej zmiennej, czy jest to tablica;
źródło
instanceof
. Myślę, że to zawodzi w kilku dziwnych scenariuszach.Zrobiłbym funkcję, aby przetestować typ obiektu, z którym masz do czynienia ...
możesz napisać proste zdanie if ...
źródło
Robię to w bardzo prosty sposób. Pracuje dla mnie. Jakieś wady?
źródło
{isArray:true}
JSON.parse(someDataFromElsewhere).items.isArray
może zwrócić wartość true (w zależności od danych) i złamać kod.Oto moja próba ulepszenia tej odpowiedzi, biorąc pod uwagę komentarze:
Pozbywa się instrukcji if / else i uwzględnia możliwość, że tablica będzie pusta lub niezdefiniowana
źródło
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
źródło
Zaktualizowałem skrzypce jsperf dwiema alternatywnymi metodami oraz sprawdzaniem błędów.
Okazuje się, że metoda definiowania stałej wartości w prototypach „Object” i „Array” jest szybsza niż jakakolwiek inna metoda. To nieco zaskakujący wynik.
Te dwie metody nie działają, jeśli zmienna przyjmuje niezdefiniowaną wartość, ale działają, jeśli masz pewność, że mają wartość. Jeśli chodzi o sprawdzanie pod kątem wydajności, czy wartość jest tablicą czy pojedynczą wartością, druga metoda wygląda jak poprawna metoda szybka. Jest nieco szybszy niż „instanceof” w Chrome, dwa razy szybszy niż druga najlepsza metoda w Internet Explorerze, Operze i Safari (na moim komputerze).
źródło
Wiem, że ludzie szukają pewnego rodzaju surowego podejścia do javascript. Ale jeśli chcesz mniej myśleć, zajrzyj tutaj: http://underscorejs.org/#isArray
Zwraca true, jeśli obiekt jest tablicą.
źródło
Najlepszym rozwiązaniem, jakie widziałem, jest zamiennik przeglądarki typeof na przeglądarkę. Sprawdź rozwiązanie Angusa Crolla tutaj .
Wersja TL; DR znajduje się poniżej, ale artykuł stanowi świetną dyskusję na ten temat, dlatego powinieneś ją przeczytać, jeśli masz czas.
źródło
Oto moje leniwe podejście:
Wiem, że świętokradztwo polega na „zepsuciu” prototypu, ale wydaje się, że działa znacznie lepiej niż zalecana
toString
metoda .Uwaga: pułapką tego podejścia jest to, że nie zadziała ono ponad
iframe
granicami , ale w moim przypadku użycia nie stanowi to problemu.źródło
wat = {array_: true}
przedmioty.obj.array_ = true
, to tylko oszukujesz siebie .cache
obiekcie do zapamiętywania wyników wyszukiwania, który wykorzystuje ciągi wyszukiwania jako klucze właściwości. Co jeśli użytkownik szukaarray_
? Czy z tego powodu Twój obiekt staje się tablicą? To tylko błąd..array_
się na użycie tagów do tablic. Tak naprawdę tak nie jest,.array
może to znaczyć cokolwiek. Powinieneś przynajmniej użyć ciągu opisowego i zasygnalizować niestosowność dowolnego użycia, np.__isArray = true
. Z.Dobry przykład znajduje się w książce Stoyan Stefanov Patterns JavaScript Patterns, która ma obsługiwać wszystkie możliwe problemy, a także wykorzystywać metodę ECMAScript 5 Array.isArray () .
Oto on:
Nawiasem mówiąc, jeśli używasz jQuery, możesz użyć jego metody $ .isArray ()
źródło
if(!Array.isArray) {...
?najłatwiejszy i najszybszy sposób sprawdzenia, czy obiekt jest tablicą, czy nie.
lub
lub możesz zrobić funkcję narzędzia:
stosowanie:
źródło
Poniższe informacje można zastosować, jeśli wiesz, że twój obiekt nie ma metody konkat.
źródło
Możesz użyć metody isArray, ale wolałbym to sprawdzić
Object.getPrototypeOf(yourvariable) === Array.prototype
źródło
Object.getPrototypeOf(yourvariable)
zwraca prototyp obiektu Array. Kod jest najszybszy i bezpieczny, na którym można polegać.Jeśli jedynymi dwoma rodzajami wartości, które można przekazać do tej funkcji, jest ciąg znaków lub tablica ciągów znaków, zachowaj prostotę i
typeof
sprawdź, czy istnieje ciąg znaków:źródło
W poszukiwaniu najkrótszej wersji oto, co do tej pory mam.
Uwaga: nie ma idealnej funkcji, która zawsze wykryłaby wszystkie możliwe kombinacje. Lepiej poznać wszystkie umiejętności i ograniczenia swoich narzędzi, niż oczekiwać magicznego narzędzia.
źródło
A.map !== undefined
ale tak, to może być śliska droga w świecie małpich patcherów;)źródło
Prosta funkcja do testowania, czy wartością wejściową jest tablica, jest następująca:
Działa to w różnych przeglądarkach i starszych przeglądarkach. Jest to pobierane z postu na blogu TJ Crowders
źródło
Możesz spróbować:
źródło
Ta funkcja zamieni prawie wszystko w tablicę:
Korzysta z niektórych nowszych funkcji przeglądarki, więc może być konieczne wypełnienie go polifillem w celu uzyskania maksymalnego wsparcia.
Przykłady:
Ciągi znaków NB zostaną przekonwertowane na tablicę z jednym elementem zamiast tablicy znaków. Usuń
isString
zaznaczenie, jeśli wolisz na odwrót.Użyłem
Array.isArray
tutaj, ponieważ jest to najbardziej solidny, a także najprostszy.źródło
W twoim przypadku możesz użyć
concat
metody Array, która może akceptować pojedyncze obiekty, a także tablicę (a nawet kombinację):concat
wydaje się być jedną z najstarszych metod Array (nawet IE 5.5 dobrze o tym wie).źródło