Как преобразовать строку в массив символов в JavaScript?
Я думаю получить строку, как "Hello world!"в массив
['H','e','l','l','o',' ','w','o','r','l','d','!']
Как преобразовать строку в массив символов в JavaScript?
Я думаю получить строку, как "Hello world!"в массив
['H','e','l','l','o',' ','w','o','r','l','d','!']
Ответы:
Примечание. Это не соответствует юникоду.
"I💖U".split('')приводит к массиву из 4 символов,["I", "�", "�", "u"]который может привести к опасным ошибкам. Смотрите ответы ниже для безопасных альтернатив.
Просто разделите его на пустую строку.
var output = "Hello world!".split('');
console.log(output);
Смотрите String.prototype.split()MDN документы .
"randomstring".length; //12 "randomstring"[2]; //"n"
str.lengthне сообщает вам количество символов в строке, поскольку некоторые символы занимают больше места, чем другие; str.lengthговорит вам количество 16-битных чисел.
Как hippietrail предполагает , ответ Meder в может нарушить суррогатные пары и извращают «символы.» Например:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
Я предлагаю использовать одну из следующих функций ES2015, чтобы правильно обрабатывать эти последовательности символов.
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
uФлаг RegExp> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Используйте /(?=[\s\S])/uвместо, /(?=.)/uпотому .что не совпадает с символами новой строки .
Если вы все еще находитесь в эпохе ES5.1 (или если ваш браузер неправильно обрабатывает это регулярное выражение - например, Edge), вы можете использовать эту альтернативу (предоставлено Babel ):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Обратите внимание, что Вавилон пытается правильно обрабатывать непревзойденных суррогатов. Однако, это, кажется, не работает для непревзойденных низких суррогатов.
🏳️🌈, и разделяет объединяющую диакритическую метку от символов. Если вы хотите разбить кластеры графем вместо символов, см. Stackoverflow.com/a/45238376 .
spreadСинтаксис
Вы можете использовать синтаксис распространения , инициализатор массива, представленный в стандарте ECMAScript 2015 (ES6) :
var arr = [...str];
Примеры
function a() {
return arguments;
}
var str = 'Hello World';
var arr1 = [...str],
arr2 = [...'Hello World'],
arr3 = new Array(...str),
arr4 = a(...str);
console.log(arr1, arr2, arr3, arr4);
Первые три результата в:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
Последний результат в
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
Поддержка браузера
Проверьте таблицу совместимости ECMAScript ES6 .
дальнейшее чтение
spreadтакже упоминается как " splat" (например, в PHP или Ruby или как " scatter" (например, в Python ).
демонстрация
Вы также можете использовать Array.from.
var m = "Hello world!";
console.log(Array.from(m))
Этот метод был введен в ES6.
Это старый вопрос, но я столкнулся с другим решением, которого пока нет в списке.
Вы можете использовать функцию Object.assign, чтобы получить желаемый результат:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
Не обязательно правильно или неправильно, просто другой вариант.
Array.from("Hello, world").
[..."Hello, world"]
Это уже есть:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
Или для более старой версии, удобной для браузера, используйте:
var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index).
charAt()хотя я бы предпочел использовать вариант массива. Штопать IE.
Есть (по крайней мере) три разные вещи, которые вы можете рассматривать как «персонажа», и, следовательно, три разных категории подхода, которые вы можете использовать.
Строки JavaScript изначально были изобретены как последовательности единиц кода UTF-16, еще в истории, когда существовала взаимно-однозначная связь между единицами кода UTF-16 и кодовыми точками Unicode. .lengthСвойство строки измеряет длину в UTF-16 единиц коды, и когда вы делаете someString[i]вы получаете I - й UTF-16 код единицы someString.
Следовательно, вы можете получить массив кодовых блоков UTF-16 из строки, используя цикл for в стиле C с индексной переменной ...
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
Существуют также различные короткие способы достижения того же, например, использование .split()пустой строки в качестве разделителя:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
Однако, если ваша строка содержит кодовые точки, которые состоят из нескольких кодовых блоков UTF-16, это разделит их на отдельные кодовые блоки, что может оказаться не тем, что вам нужно. Например, строка '𝟘𝟙𝟚𝟛'состоит из четырех кодовых точек Unicode (кодовые точки от 0x1D7D8 до 0x1D7DB), каждая из которых в UTF-16 состоит из двух кодовых блоков UTF-16. Если мы разделим эту строку, используя методы выше, мы получим массив из восьми единиц кода:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
Так что, возможно, мы хотим вместо этого разделить нашу строку на Unicode Code Points! Это стало возможным с тех пор, как в ECMAScript 2015 была добавлена концепция итерируемого языка. Строки теперь итерируемые, и когда вы перебираете их (например, с помощью for...ofцикла), вы получаете кодовые точки Unicode, а не единицы кода UTF-16:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
Мы можем сократить это, используя Array.fromитерацию для итерируемого, который он передается неявно:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);
Однако Юникод кодовых точки не самое большое, что могло возможно считать «характер» либо . Некоторые примеры вещей, которые можно разумно рассматривать как один «символ», но которые состоят из нескольких кодовых точек, включают:
Ниже мы увидим, что если мы попытаемся преобразовать строку с такими символами в массив с помощью механизма итерации, описанного выше, символы будут разбиты в результирующем массиве. (В случае, если какой-либо из персонажей не отображается в вашей системе, yourStringниже представлена заглавная буква A с острым акцентом, за которой следует флаг Соединенного Королевства, за которым следует чернокожая женщина.)
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
Если мы хотим сохранить каждый из них как один элемент в нашем конечном массиве, то нам нужен массив графем , а не кодовые точки.
JavaScript не имеет встроенной поддержки для этого - по крайней мере, пока. Поэтому нам нужна библиотека, которая понимает и реализует правила Unicode, для которых комбинация кодовых точек составляет графему. К счастью, существует одно: графем-сплиттер Орлинга . Вы можете установить его с помощью npm или, если вы не используете npm, загрузить файл index.js и использовать его с <script>тегом. Для этой демонстрации я буду загружать ее из jsDelivr.
графема-разветвитель дает нам GraphemeSplitterкласс с тремя методами: splitGraphemes, iterateGraphemesи countGraphemes. Естественно, мы хотим splitGraphemes:
const splitter = new GraphemeSplitter();
const yourString = 'Á🇬🇧👩🏿';
const charArray = splitter.splitGraphemes(yourString);
console.log(charArray);
<script src="https://cdn.jsdelivr.net/npm/grapheme-splitter@1.0.4/index.js"></script>
И вот мы - массив из трех графем, что, вероятно, то, что вы хотели.
Вы можете перебрать всю длину строки и нажать символ в каждой позиции :
const str = 'Hello World';
const stringToArray = (text) => {
var chars = [];
for (var i = 0; i < text.length; i++) {
chars.push(text[i]);
}
return chars
}
console.log(stringToArray(str))
"😃".charAt(0)вернет непригодного персонажа
.split("")снова делает самый быстрый вариант
.split("")кажется, сильно оптимизирован в Firefox. Хотя цикл имеет одинаковую производительность в Chrome и Firefox, он значительно быстрее в Firefox для малых и больших входов.
простой ответ:
let str = 'this is string, length is >26';
console.log([...str]);
Одна возможность заключается в следующем:
console.log([1, 2, 3].map(e => Math.random().toString(36).slice(2)).join('').split('').map(e => Math.random() > 0.5 ? e.toUpperCase() : e).join(''));
Как насчет этого?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice также сделает эту работу.
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')результаты в["�", "�"].