Jak przekonwertować ciąg na tablicę znaków w JavaScript?
Myślę, że otrzymam ciąg podobny "Hello world!"
do tablicy
['H','e','l','l','o',' ','w','o','r','l','d','!']
javascript
arrays
string
DarkLightA
źródło
źródło
"𨭎".split('')
powoduje w["�", "�"]
."randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
nie podaje liczby znaków w ciągu, ponieważ niektóre znaki zajmują więcej miejsca niż inne;str.length
podaje liczbę liczb 16-bitowych.Jak sugeruje hippietrail , odpowiedź medera może rozbijać pary zastępcze i błędnie interpretować „postacie”. Na przykład:
Sugeruję użycie jednej z następujących funkcji ES2015, aby poprawnie obsługiwać te sekwencje znaków.
Rozkładanie składni ( odpowiedź już wstawiona przez inserttusernamehere)
Array.from
u
Flaga RegExpUżyj
/(?=[\s\S])/u
zamiast,/(?=.)/u
ponieważ.
nie pasuje do nowych linii .Jeśli nadal jesteś w erze ES5.1 (lub jeśli Twoja przeglądarka nie obsługuje poprawnie tego wyrażenia regularnego - takiego jak Edge), możesz użyć tej alternatywy (transpilowanej przez Babel ):
Zauważ, że Babel próbuje również poprawnie obsługiwać niedopasowane parametry zastępcze. Nie wydaje się to jednak działać w przypadku niedopasowanych niskich surogatów.
Przetestuj wszystko w przeglądarce:
Pokaż fragment kodu
źródło
🏳️🌈
i dzieli znak diakrytyczny od znaków. Jeśli chcesz podzielić na klastry grafem zamiast znaków, zobacz stackoverflow.com/a/45238376 .spread
SkładniaMożesz użyć składni stron widzących , inicjatora macierzy wprowadzonego w standardzie ECMAScript 2015 (ES6) :
Przykłady
Pierwsze trzy wynik to:
Ostatni powoduje
Obsługa przeglądarki
Sprawdź tabelę zgodności ECMAScript ES6 .
Dalsza lektura
spread
jest również określany jako „splat
” (np. w PHP lub Ruby lub jako „scatter
” (np. w Pythonie ).Próbny
Wypróbuj przed zakupem
źródło
Możesz także użyć
Array.from
.Ta metoda została wprowadzona w ES6.
Odniesienie
Array.from
źródło
To stare pytanie, ale natknąłem się na inne rozwiązanie jeszcze nie wymienione.
Możesz użyć funkcji Object.assign, aby uzyskać pożądany wynik:
Niekoniecznie dobre lub złe, tylko inna opcja.
Object.assign jest dobrze opisany na stronie MDN.
źródło
Array.from("Hello, world")
.[..."Hello, world"]
To już jest:
Lub w przypadku starszej wersji przyjaznej dla przeglądarki użyj:
źródło
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.charAt()
choć wolałbym użyć wariantu tablicowego. Darn IE.Istnieją (co najmniej) trzy różne rzeczy, które możesz postrzegać jako „postać”, aw konsekwencji trzy różne kategorie podejścia, które możesz chcieć zastosować.
Podział na jednostki kodu UTF-16
Ciągi JavaScript zostały pierwotnie wynalezione jako sekwencje jednostek kodu UTF-16, w pewnym momencie historii, kiedy istniała relacja jeden-do-jednego między jednostkami kodu UTF-16 a punktami kodu Unicode.
.length
Własnością łańcucha mierzy jego długość w jednostkach UTF-16 kodowych, a kiedy to zrobiszsomeString[i]
dostaniesz I th UTF-16 jednostki kodusomeString
.W związku z tym możesz uzyskać tablicę jednostek kodu UTF-16 z ciągu, używając pętli for w stylu C ze zmienną indeksową ...
Istnieją również różne krótkie sposoby osiągnięcia tego samego, na przykład użycie
.split()
pustego łańcucha jako separatora:Jeśli jednak ciąg zawiera punkty kodowe złożone z wielu jednostek kodu UTF-16, spowoduje to podzielenie ich na poszczególne jednostki kodu, co może nie być tym, czego chcesz. Na przykład ciąg znaków
'𝟘𝟙𝟚𝟛'
składa się z czterech punktów kodu Unicode (punkty kodu od 0x1D7D8 do 0x1D7DB), które w UTF-16 składają się z dwóch jednostek kodu UTF-16. Jeśli podzielimy ten ciąg przy użyciu powyższych metod, otrzymamy tablicę ośmiu jednostek kodu:Podział na punkty kodu Unicode
Być może chcemy zamiast tego podzielić nasz ciąg znaków na punkty kodowe Unicode! Było to możliwe, ponieważ ECMAScript 2015 dodał koncepcję iteracji do języka. Ciągi są teraz iterowalne, a gdy iterujesz nad nimi (np. Za pomocą
for...of
pętli), otrzymujesz punkty kodu Unicode, a nie jednostki kodu UTF-16:Możemy skrócić to, używając
Array.from
iteracji w stosunku do iterowności, która została przekazana niejawnie:Jednak punkty kodu Unicode nie są największą możliwą rzeczą, którą można by uznać za „znak” albo . Niektóre przykłady rzeczy, które można rozsądnie uznać za pojedynczy „znak”, ale składać się z wielu punktów kodowych, obejmują:
Widzimy poniżej, że jeśli spróbujemy przekonwertować ciąg z takimi znakami na tablicę za pomocą powyższego mechanizmu iteracji, znaki zostaną podzielone na wynikową tablicę. (W przypadku, gdy żadna z postaci nie renderuje się w twoim systemie,
yourString
poniżej składa się z dużej litery A z ostrym akcentem, po której następuje flaga Wielkiej Brytanii, a następnie czarna kobieta).Jeśli chcemy zachować każdy z nich jako pojedynczy element w końcowej tablicy, potrzebujemy tablicy grafemów , a nie punktów kodowych.
Podział na grafemy
JavaScript nie ma wbudowanej obsługi tego - przynajmniej jeszcze nie. Potrzebujemy więc biblioteki, która rozumie i implementuje reguły Unicode dla tego, która kombinacja punktów kodowych stanowi grafem. Na szczęście, jeden istnieje: orling jest grafem-splitter . Będziesz chciał zainstalować go z npm lub, jeśli nie używasz npm, pobierz plik index.js i podaj go ze
<script>
znacznikiem. W tym demo załaduję go z jsDelivr.grafem-splitter daje nam
GraphemeSplitter
lekcje z trzech metod:splitGraphemes
,iterateGraphemes
, icountGraphemes
. Oczywiście chcemysplitGraphemes
:I oto jesteśmy - tablica trzech grafemów, prawdopodobnie tego właśnie chciałeś.
źródło
Możesz iterować na całej długości łańcucha i przesuwać znak w każdej pozycji :
źródło
"😃".charAt(0)
zwróci postać bezużyteczną.split("")
najszybszą opcję.split("")
wydaje się być mocno zoptymalizowany w Firefoksie. Podczas gdy pętla ma podobną wydajność w dzieleniu chrome i firefox, jest znacznie szybsza w firefoxie dla małych i dużych danych wejściowych.prosta odpowiedź:
źródło
Jedna z możliwości jest następna:
źródło
Co powiesz na to?
źródło
Array.prototype.slice również wykona pracę.
źródło