W SQL możemy sprawdzić, czy ciąg znajduje się na liście w taki sposób:
Column IN ('a', 'b', 'c')
Jaki jest dobry sposób na to w JavaScript? To takie niezręczne:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
Nie jestem pewien co do wydajności ani przejrzystości tego:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
Lub można użyć funkcji przełączania:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
Ale to okropny bałagan. Jakieś pomysły?
W takim przypadku muszę użyć programu Internet Explorer 7, ponieważ jest on przeznaczony dla firmowej strony intranetowej. Więc ['a', 'b', 'c'].indexOf(str) !== -1
nie będzie działać natywnie bez cukru składniowego.
javascript
string
list
ErikE
źródło
źródło
Odpowiedzi:
Możesz zadzwonić
indexOf
:źródło
Array.prototype.indexOf
jest to, że nie będzie działać na IE, niestety nawet IE8 nie ma tej metody.Array.indexOf
istnieje przed zastąpieniem,Array.prototype.indexOf
które nie są tym samym. Poleciłbym implementację udostępnioną przez Mozillę dostępną tutaj: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Jeśli używasz ES6, możesz zbudować tablicę przedmiotów i użyć
includes
:Ma to pewne nieodłączne zalety,
indexOf
ponieważ może poprawnie przetestować obecnośćNaN
na liście i może dopasować brakujące elementy tablicy, takie jak środkowy[1, , 2]
doundefined
.includes
działa również na tablicach typu JavaScript, takich jakUint8Array
.Jeśli martwisz się o obsługę przeglądarki (np. IE lub Edge), możesz to sprawdzić
Array.includes
na CanIUse.Com , a jeśli chcesz kierować na przeglądarkę lub brakującą wersję przeglądarkiincludes
, polecam polyfill.io do wypełniania.Bez szyku
Możesz dodać nową
isInList
właściwość do ciągów w następujący sposób:Następnie użyj go w następujący sposób:
Możesz zrobić to samo dla
Number.prototype
.Array.indexOf
Jeśli korzystasz z nowoczesnej przeglądarki,
indexOf
zawsze działa. Jednak w IE8 i wcześniejszych wersjach będziesz potrzebować wielokrotnego wypełnienia.Jeśli
indexOf
zwraca -1, pozycji nie ma na liście. Pamiętaj jednak, że ta metoda nie sprawdza poprawnieNaN
i chociaż może dopasować jawneundefined
, nie może dopasować brakującego elementu doundefined
jak w tablicy[1, , 2]
.Wielokrotne wypełnianie dla
indexOf
lubincludes
w IE, lub dowolnej innej przeglądarce / wersji bez wsparciaJeśli nie chcesz korzystać z usługi takiej jak polyfill.io, jak wspomniano powyżej, zawsze możesz zawrzeć w swoim własnym kodzie źródłowym niestandardowe polypełniacze zgodne z normami. Na przykład Mozilla Developer Network ma jeden dla
indexOf
.W tej sytuacji, w której musiałem stworzyć rozwiązanie dla Internet Explorera 7, „opracowałem własną” prostszą wersję
indexOf()
funkcji, która nie jest zgodna ze standardami:Nie sądzę jednak, aby modyfikowanie
Array.prototype
było najlepszą odpowiedzią na dłuższą metę. ModyfikowanieObject
i tworzenieArray
prototypów w JavaScript może prowadzić do poważnych błędów. Musisz zdecydować, czy jest to bezpieczne we własnym środowisku. Najważniejszą rzeczą jest to, że iteracja tablicy (gdy Array.prototype ma właściwości)for ... in
zwróci nową nazwę funkcji jako jeden z kluczy:Twój kod może już działać, ale w momencie, gdy ktoś w przyszłości doda bibliotekę JavaScript lub wtyczkę innej firmy, która nie gorliwie chroni przed odziedziczonymi kluczami, wszystko może się zepsuć.
Starym sposobem uniknięcia tego zerwania jest, podczas wyliczania, sprawdzenie każdej wartości, aby sprawdzić, czy obiekt rzeczywiście ma ją jako właściwość nieprzechowaną,
if (arr.hasOwnProperty(x))
i tylko z nią pracowaćx
.Nowy ES6 sposobem na uniknięcie tego problemu dodatkowy klucz jest użycie
of
zamiastin
,for (let x of arr)
. Jednakże, chyba że możesz zagwarantować, że cały twój kod i biblioteki stron trzecich ściśle trzymają się tej metody, to do celów tego pytania prawdopodobnie po prostu będziesz chciał użyć,includes
jak podano powyżej.źródło
indexOf
MDN. Zasadniczo robi to samo, ale z kilkoma zwarciami dla łatwej oceny.Większość odpowiedzi sugeruje
Array.prototype.indexOf
metodę, jedynym problemem jest to, że nie będzie działać na żadnej wersji IE przed IE9.Alternatywnie pozostawiam ci dwie dodatkowe opcje, które będą działać na wszystkich przeglądarkach:
źródło
"HiFooThere"
- wybrałbym/^(?:Foo|Bar|Baz)$/
zamiast tego (początek łańcucha, grupa nie przechwytująca, koniec łańcucha).indexOf
jest teraz obsługiwany w IE 9 i nowszych zgodnie z MDN .Tablice mają
indexOf
metodę, za pomocą której można wyszukiwać ciągi:źródło
Trik, którego użyłem, to
Możesz zrobić coś takiego
źródło
var i=a.length;while (i--) {/*use a[i]*/}
jest najszybsza metoda pętli (jeśli dopuszczalne jest odwrotne zamówienie).To moje:
Ten jest szybszy, jeśli jesteś w stanie przekazać tablicę:
Oto jsperf: http://jsperf.com/bmcgin-inlsit
źródło
Array
prototypie: może coś w tym rodzajuArray.prototype.contains
.RegExp
jest uniwersalny, ale rozumiem, że pracujesz z tablicami. Sprawdź to podejście. Używam go, a to jest bardzo skuteczne i płonące szybko!Możesz także zastosować pewne modyfikacje, np .:
Jednowarstwowa
Bez względu na wielkość liter
I wiele innych!
źródło
Korzystanie z indexOf (nie działa z IE8).
Aby wesprzeć IE8, możesz zaimplementować indexOf Mozilli.
Wyrażenia regularne za pośrednictwem String.prototype.match (docs).
źródło
Wygląda na to, że musisz użyć funkcji in_array.
jQuery -> inArray
Prototyp -> Array.indexOf
Lub zobacz poniższe przykłady, jeśli nie używasz jQuery lub Prototype:
Uwaga stylistyczna: zmienne o nazwie thisthing thatthing, powinny być nazwane, aby powiedzieć ci coś o tym, co zawierają (rzecz.).
źródło
Oprócz
indexOf
(które sugerują inne plakaty) użycie Enumerable.include () prototypu może uczynić to bardziej schludnym i zwięzłym:źródło
Dzięki za pytanie i rozwiązanie za pomocą metody Array.indexOf.
Użyłem kodu z tego rozwiązania, aby utworzyć funkcję inList (), która, IMO, uprościłaby pisanie, a odczyt był jaśniejszy:
STOSOWANIE:
źródło
'Houston'.inList(['LA', 'New York', 'Houston'])
. Być możeif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}
lub za pomocą twojejwhile
metody.Dziwi mnie, że nikt nie wspomniał o prostej funkcji, która pobiera ciąg znaków i listę.
źródło
int
, a ponieważ niektórzy ludzie mogą natknąć się na to pytanie w poszukiwaniubool
odpowiedzi. Pomyślałem, że może to pomóc kilku osobom.Moje rozwiązanie daje następującą składnię:
I implementuję to poprzez rozszerzenie podstawowego prototypu Object, jak poniżej:
Alternatywnie możemy nazwać metodę isInArray (ale prawdopodobnie nie inArray) lub po prostu isIn.
Zalety: Prosty, prosty i samodokumentujący.
źródło
myValues[key];
haszapy : gdzie myValues jest obiektem, a klucz jest dowolnym ciągiem lub liczbą.Uproszczona wersja odpowiedzi SLaks działa również:
.... ponieważ ciągi są rodzajem samych tablic. :)
W razie potrzeby zaimplementuj funkcję indexof dla Internet Explorera zgodnie z wcześniejszym opisem.
źródło