Chciałbym ostrzec każdą literę ciągu, ale nie jestem pewien, jak to zrobić.
Więc jeśli mam:
var str = 'This is my string';
Chciałbym móc osobno alarmować T, h, i, s itp. To dopiero początek pomysłu, nad którym pracuję, ale muszę wiedzieć, jak przetwarzać każdą literę osobno.
Chcę użyć jQuery i pomyślałem, że może potrzebuję użyć funkcji podziału po przetestowaniu długości łańcucha.
Pomysły?
javascript
jquery
string
Nic Hubbard
źródło
źródło
for(const c of str) { ... }
. Więcej na ten temat poniżej w dość szczegółowej, ale niewystarczająco pozytywnej odpowiedzi. PS: Link @ ARJUN nie działa dla mnie.Odpowiedzi:
Jeśli kolejność alertów ma znaczenie, użyj tego:
Jeśli kolejność alertów nie ma znaczenia, użyj tego:
Pokaż fragment kodu
źródło
[]
znaku w celu uzyskania znaku w określonej pozycji nie jest obsługiwane w IE <9charAt
pozostało z UCS-2 dni, kiedy nie było żadnych par zastępczych i aby rozwiązać problem, dodano nową funkcjęcodepointAt
do JavaScript, która poprawnie obsługuje nasz przyjazny stos kupek. Wierzę, że Java też to ma.Prawdopodobnie jest to więcej niż rozwiązane. Chcę tylko pomóc w innym prostym rozwiązaniu:
źródło
[...text].forEach(console.log)
forEach()
przekazuje indeks i tablicę jako drugi i trzeci argument. Wolałbym tego nie rejestrować ...for (let c of [...text]) { console.log(c) }
let c of text
już wykonuje swoją pracę.Jedno możliwe rozwiązanie w czystym javascript:
źródło
Jak przetwarzać każdą literę tekstu (z testami porównawczymi)
https://jsperf.com/str-for-in-of-foreach-map-2dla
Klasyczny i zdecydowanie najbardziej wydajny . Powinieneś iść z tym, jeśli planujesz używać go w algorytmie krytycznym pod względem wydajności lub że wymaga on maksymalnej kompatybilności z wersjami przeglądarki.
dla ... z
for ... of to nowy ES6 dla iteratora. Obsługiwane przez większość nowoczesnych przeglądarek. Jest to bardziej atrakcyjne wizualnie i mniej podatne na błędy w pisaniu. Jeśli wybierasz ten w aplikacji produkcyjnej, prawdopodobnie powinieneś użyć transpilatora takiego jak Babel .
dla każdego
Podejście funkcjonalne . Zatwierdzony przez Airbnb . Największym minusem robienia tego w ten sposób jest to
split()
, że tworzy nową tablicę do przechowywania każdej pojedynczej litery łańcucha.lub
Poniżej znajdują się te, których nie lubię.
dla w
W przeciwieństwie do ... z, zamiast litery dostajesz indeks listów. Działa dość źle.
mapa
Podejście funkcyjne, co jest dobre. Jednak mapa nie jest do tego przeznaczona. Należy go użyć, gdy trzeba zmienić wartości wewnątrz tablicy, co nie ma miejsca.
lub
źródło
for
pętla była w rzeczywistości drugą najwolniejszą, podczas gdyfor...of
była najszybsza (około trzy razy szybciej niżfor
).for
pętla jest nieco szybsza.Większość, jeśli nie wszystkie, odpowiedzi tutaj są błędne, ponieważ ulegną one zepsuciu, gdy w ciągu znaków znajdzie się znak spoza Unicode BMP (Basic Multilingual Plane) . Oznacza to, że wszystkie emoji zostaną zepsute .
JavaScript używa UTF- 16 Unicode dla wszystkich ciągów. W UTF-16 postacie poza BMP składają się z dwóch części, zwanych „ parą zastępczą ”, a większość odpowiedzi tutaj przetworzy każdą część takich par indywidualnie, a nie jako pojedynczy znak.
Jednym ze sposobów we współczesnym JavaScript od co najmniej 2016 roku jest użycie nowego iteratora ciągów . Oto przykład (prawie) prosto z MDN:
źródło
Możesz tego spróbować
źródło
Jeszcze jedno rozwiązanie ...
źródło
for..of
pętlifor (let ch of t) { alert(ch) }
Kiedy muszę napisać krótki kod lub linijkę, używam tego „hacka”:
To nie liczy nowych linii, więc może to być dobra lub zła rzecz. Jeśli które należą do nowej linii, należy wymienić:
/./
z/[\S\s]/
. Drugi wkładki można zobaczyć prawdopodobnie używać.split()
który ma wiele problemówźródło
forEach
wywołania w porównaniu do wysłanych parametrówreplace
. Jeśli wiem, że ASCIIing, myślę, że wciąż mam kilka przypadków użyciasplit
. Świetna odpowiedź!u
flagi wraz zg
flagą? OK właśnie przetestowałem i miałem rację.Nowy JS pozwala na:
źródło
Lepiej jest użyć instrukcji for ..., jeśli ciąg znaków zawiera znaki Unicode, ze względu na inny rozmiar bajtu.
źródło
krótka odpowiedź:
Array.from(string)
da ci to, czego prawdopodobnie chcesz, a następnie będziesz mógł iterować na nim lub cokolwiek innego, ponieważ jest to tylko tablica.ok, spróbujmy z tym ciągiem:
abc|⚫️\n⚪️|👨👩👧👧
.punkty kodowe to:
więc niektóre znaki mają jeden punkt kodowy (bajt), a niektóre mają dwa lub więcej, a nowy wiersz został dodany do dodatkowych testów.
więc po przetestowaniu są dwa sposoby:
źródło
Możesz teraz iterować poszczególne punkty kodu Unicode zawarte w ciągu znaków, używając
String.prototype[@@iterator]
, który zwraca wartość dobrze znanego typu SymbolSymbol.iterator
- domyślny iterator dla obiektów podobnych do tablicy (String
w tym przypadku).Przykładowy kod:
Działa to ze znakami Unicode, takimi jak emoji lub znaki inne niż rzymskie, które wyzwalałyby starsze konstrukcje.
Odniesienie: MDN Link do String.prototype @@ iterator .
źródło
for ... of
pętlą na łańcuchu - to znaczy cukier składniowy umożliwiający dostęp do iteratora.Teraz można używać w kluczowych.
źródło
in
jest uzasadnioną częścią języka. Używaj rzeczy odpowiednio. Twój artykuł ostrzega, żein
interpretuje klawisze alfa tak samo jak klawisze numeryczne. Więc? Może tego właśnie chcesz. Można również powiedzieć, że inne metody niepoprawnie ignorują klawisze alfa. Imoof
ma prawidłowe zachowanie. W tablicach JS elementy bez kluczy alfa nadal mają klucze: numeryczne. W mojej konsoli JS „poprawnie” traktuje klawisz alfa tak samo jak klawisze numeryczne:>const arr = ['a', 'b'] >arr.test = 'hello' >arr 0: "a" 1: "b" test: "hello" length: 2
Możesz uzyskać tablicę takich postaci
a następnie zapętlić za pomocą zwykłego Javascript, w przeciwnym razie możesz iterować znaki ciągu za pomocą jQuery przez
źródło
możesz przekonwertować ten ciąg znaków na tablicę znaków przy użyciu
split()
, a następnie iterować go.źródło
Jeśli chcesz wykonać transformację tekstu na poziomie znaków i odzyskać przekształcony tekst na końcu, możesz zrobić coś takiego:
Więc kroki:
źródło
W dzisiejszym JavaScript możesz
Array.prototype.map.call('This is my string', (c) => c+c)
Oczywiście c + c reprezentuje cokolwiek chcesz zrobić z c.
To zwraca
["TT", "hh", "ii", "ss", " ", "ii", "ss", " ", "mm", "yy", " ", "ss", "tt", "rr", "ii", "nn", "gg"]
źródło
[...'This is my string'].map((c)=>c+c)
Powinno to działać w starszych przeglądarkach i ze znakami UTF-16, takimi jak 💩.
To powinno być najbardziej kompatybilne rozwiązanie. Jest jednak mniej wydajna niż
for
pętla.Wygenerowałem wyrażenie regularne za pomocą regexpu
Mam nadzieję że to pomoże!
źródło
Możesz uzyskać dostęp do pojedynczych znaków za pomocą
str.charAt(index)
lubstr[index]
. Ale ten drugi sposób nie jest częścią ECMAScript, więc lepiej przejdź do poprzedniego.źródło
Jeśli chcesz animować każdą postać, może być konieczne zawinięcie jej w element span;
Myślę, że to najlepszy sposób, aby to zrobić, a następnie przetworzyć zakresy. (na przykład z TweenMax)
TweenMax.staggerFromTo ($ demoText.find („span”), 0,2, {autoAlpha: 0}, {autoAlpha: 1}, 0,1);
źródło
Wypróbuj ten kod
źródło