Как преобразовать строку в массив символов в JavaScript?
Я думаю получить строку, как "Hello world!"
в массив
['H','e','l','l','o',' ','w','o','r','l','d','!']
javascript
arrays
string
DarkLightA
источник
источник
"𨭎".split('')
результаты в["�", "�"]
."randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
не сообщает вам количество символов в строке, поскольку некоторые символы занимают больше места, чем другие;str.length
говорит вам количество 16-битных чисел.Как hippietrail предполагает , ответ Meder в может нарушить суррогатные пары и извращают «символы.» Например:
Я предлагаю использовать одну из следующих функций ES2015, чтобы правильно обрабатывать эти последовательности символов.
Синтаксис распространения ( уже ответил на имя пользователя вставки здесь)
Array.from
u
Флаг RegExpИспользуйте
/(?=[\s\S])/u
вместо,/(?=.)/u
потому.
что не совпадает с символами новой строки .Если вы все еще находитесь в эпохе ES5.1 (или если ваш браузер неправильно обрабатывает это регулярное выражение - например, Edge), вы можете использовать эту альтернативу (предоставлено Babel ):
Обратите внимание, что Вавилон пытается правильно обрабатывать непревзойденных суррогатов. Однако, это, кажется, не работает для непревзойденных низких суррогатов.
Протестируйте все в вашем браузере:
Показать фрагмент кода
источник
🏳️🌈
, и разделяет объединяющую диакритическую метку от символов. Если вы хотите разбить кластеры графем вместо символов, см. Stackoverflow.com/a/45238376 .spread
СинтаксисВы можете использовать синтаксис распространения , инициализатор массива, представленный в стандарте ECMAScript 2015 (ES6) :
Примеры
Первые три результата в:
Последний результат в
Поддержка браузера
Проверьте таблицу совместимости ECMAScript ES6 .
дальнейшее чтение
spread
также упоминается как "splat
" (например, в PHP или Ruby или как "scatter
" (например, в Python ).демонстрация
Попробуй перед покупкой
источник
Вы также можете использовать
Array.from
.Этот метод был введен в ES6.
Ссылка
Array.from
источник
Это старый вопрос, но я столкнулся с другим решением, которого пока нет в списке.
Вы можете использовать функцию Object.assign, чтобы получить желаемый результат:
Не обязательно правильно или неправильно, просто другой вариант.
Object.assign хорошо описан на сайте MDN.
источник
Array.from("Hello, world")
.[..."Hello, world"]
Это уже есть:
Или для более старой версии, удобной для браузера, используйте:
источник
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.charAt()
хотя я бы предпочел использовать вариант массива. Штопать IE.Есть (по крайней мере) три разные вещи, которые вы можете рассматривать как «персонажа», и, следовательно, три разных категории подхода, которые вы можете использовать.
Разбиение на кодовые единицы UTF-16
Строки JavaScript изначально были изобретены как последовательности единиц кода UTF-16, еще в истории, когда существовала взаимно-однозначная связь между единицами кода UTF-16 и кодовыми точками Unicode.
.length
Свойство строки измеряет длину в UTF-16 единиц коды, и когда вы делаетеsomeString[i]
вы получаете I - й UTF-16 код единицыsomeString
.Следовательно, вы можете получить массив кодовых блоков UTF-16 из строки, используя цикл for в стиле C с индексной переменной ...
Существуют также различные короткие способы достижения того же, например, использование
.split()
пустой строки в качестве разделителя:Однако, если ваша строка содержит кодовые точки, которые состоят из нескольких кодовых блоков UTF-16, это разделит их на отдельные кодовые блоки, что может оказаться не тем, что вам нужно. Например, строка
'𝟘𝟙𝟚𝟛'
состоит из четырех кодовых точек Unicode (кодовые точки от 0x1D7D8 до 0x1D7DB), каждая из которых в UTF-16 состоит из двух кодовых блоков UTF-16. Если мы разделим эту строку, используя методы выше, мы получим массив из восьми единиц кода:Разделение на кодовые точки Unicode
Так что, возможно, мы хотим вместо этого разделить нашу строку на Unicode Code Points! Это стало возможным с тех пор, как в ECMAScript 2015 была добавлена концепция итерируемого языка. Строки теперь итерируемые, и когда вы перебираете их (например, с помощью
for...of
цикла), вы получаете кодовые точки Unicode, а не единицы кода UTF-16:Мы можем сократить это, используя
Array.from
итерацию для итерируемого, который он передается неявно:Однако Юникод кодовых точки не самое большое, что могло возможно считать «характер» либо . Некоторые примеры вещей, которые можно разумно рассматривать как один «символ», но которые состоят из нескольких кодовых точек, включают:
Ниже мы увидим, что если мы попытаемся преобразовать строку с такими символами в массив с помощью механизма итерации, описанного выше, символы будут разбиты в результирующем массиве. (В случае, если какой-либо из персонажей не отображается в вашей системе,
yourString
ниже представлена заглавная буква A с острым акцентом, за которой следует флаг Соединенного Королевства, за которым следует чернокожая женщина.)Если мы хотим сохранить каждый из них как один элемент в нашем конечном массиве, то нам нужен массив графем , а не кодовые точки.
Расщепление на графемы
JavaScript не имеет встроенной поддержки для этого - по крайней мере, пока. Поэтому нам нужна библиотека, которая понимает и реализует правила Unicode, для которых комбинация кодовых точек составляет графему. К счастью, существует одно: графем-сплиттер Орлинга . Вы можете установить его с помощью npm или, если вы не используете npm, загрузить файл index.js и использовать его с
<script>
тегом. Для этой демонстрации я буду загружать ее из jsDelivr.графема-разветвитель дает нам
GraphemeSplitter
класс с тремя методами:splitGraphemes
,iterateGraphemes
иcountGraphemes
. Естественно, мы хотимsplitGraphemes
:И вот мы - массив из трех графем, что, вероятно, то, что вы хотели.
источник
Вы можете перебрать всю длину строки и нажать символ в каждой позиции :
источник
"😃".charAt(0)
вернет непригодного персонажа.split("")
снова делает самый быстрый вариант.split("")
кажется, сильно оптимизирован в Firefox. Хотя цикл имеет одинаковую производительность в Chrome и Firefox, он значительно быстрее в Firefox для малых и больших входов.простой ответ:
источник
Одна возможность заключается в следующем:
источник
Как насчет этого?
источник
Array.prototype.slice также сделает эту работу.
источник