Как разбить строку на массив символов?

var s = "overpopulation";
var ar = [];
ar = s.split();
alert(ar);

Я хочу, чтобы string.split слово в массив символов.

Вышеприведенный код не работает - он возвращает "перенаселенность" как Object..

Как разбить его на массив символов, если исходная строка не содержит запятых и пробелов?

Ответ 1

Вы можете разбить на пустую строку:

var chars = "overpopulation".split('');

Если вы просто хотите получить доступ к строке в виде массива, вы можете сделать это без split:

var s = "overpopulation";
for (var i = 0; i < s.length; i++) {
    console.log(s.charAt(i));
}

Вы также можете получить доступ к каждому символу с его индексом, используя синтаксис обычного массива. Обратите внимание, однако, что строки неизменяемы, что означает, что вы не можете установить значение символа с помощью этого метода и что он не поддерживается IE7 (если это все еще имеет значение для вас).

var s = "overpopulation";

console.log(s[3]); // logs 'r'

Ответ 2

Старый вопрос, но я должен предупредить:

НЕ используйте .split('')

Вы получите странные результаты с наборами символов не-BMP (не-Basic-Multilingual-Plane).

Причина в том, что такие методы, как .split() и .charCodeAt() учитывают только символы с кодовой точкой ниже 65536; клюв. более высокие кодовые точки представлены парой (менее значимых) псевдосимволов "суррогатного".

'𝟙𝟚𝟛'.length     // —> 6
'𝟙𝟚𝟛'.split('')  // —> ["�", "�", "�", "�", "�", "�"]

'😎'.length      // —> 2
'😎'.split('')   // —> ["�", "�"]

По возможности используйте функции ES2015 (ES6):

Использование оператора распространения :

let arr = [...str];

Или Array.from

let arr = Array.from(str);

Или split с новым u флагом RegExp:

let arr = str.split(/(?!$)/u);

Примеры:

[...'𝟙𝟚𝟛']        // —> ["𝟙", "𝟚", "𝟛"]
[...'😎😜🙃']     // —> ["😎", "😜", "🙃"]

Для ES5 варианты ограничены:

Я придумал эту функцию, которая внутренне использует пример MDN, чтобы получить правильную кодовую точку для каждого символа.

function stringToArray() {
  var i = 0,
    arr = [],
    codePoint;
  while (!isNaN(codePoint = knownCharCodeAt(str, i))) {
    arr.push(String.fromCodePoint(codePoint));
    i++;
  }
  return arr;
}

Для этого требуется функция knownCharCodeAt() и для некоторых браузеров; String.fromCodePoint() полифилл.

if (!String.fromCodePoint) {
// ES6 Unicode Shims 0.1 , © 2012 Steven Levithan , MIT License
    String.fromCodePoint = function fromCodePoint () {
        var chars = [], point, offset, units, i;
        for (i = 0; i < arguments.length; ++i) {
            point = arguments[i];
            offset = point - 0x10000;
            units = point > 0xFFFF ? [0xD800 + (offset >> 10), 0xDC00 + (offset & 0x3FF)] : [point];
            chars.push(String.fromCharCode.apply(null, units));
        }
        return chars.join("");
    }
}

Примеры:

stringToArray('𝟙𝟚𝟛')     // —> ["𝟙", "𝟚", "𝟛"]
stringToArray('😎😜🙃')  // —> ["😎", "😜", "🙃"]

Примечание: str[index] (ES5) и str.charAt(index) также будут возвращать странные результаты с кодировками, отличными от BMP. например '😎'.charAt(0) возвращает "�".

ОБНОВЛЕНИЕ: прочитайте эту хорошую статью о JS и Unicode.

Ответ 3

Это просто:

s.split("");

Разделитель представляет собой пустую строку, поэтому она будет разбиваться между каждым отдельным символом.

Ответ 4

Метод split() в javascript принимает два параметра: разделитель и предел. Сепаратор задает символ, используемый для разделения строки. Если вы не указываете разделитель, вся строка возвращается, не разделяется. Но если вы укажете пустую строку как разделитель, строка будет разделена между каждым символом.

Таким образом:

s.split('')

будет иметь эффект, который вы ищете.

Дополнительная информация здесь

Ответ 5

.split('') разделит эмодзи пополам.

Онур решения и регулярное выражение предложили работу для некоторых смайликов, но не могут обрабатывать более сложные языки или комбинированные смайлики. Считайте, что этот смайлик разрушен:

[..."🏳️‍🌈"] // returns ["🏳", "️", "‍", "🌈"]  instead of ["🏳️‍🌈"]

Также рассмотрите этот текст на хинди "अनुच्छेद", который разделен следующим образом:

[..."अनुच्छेद"]  // returns   ["अ", "न", "ु", "च", "्", "छ", "े", "द"]

но на самом деле его следует разделить следующим образом:

["अ","नु","च्","छे","द"]

потому что некоторые символы объединяют знаки (например, диакритические знаки/акценты на европейских языках).

Вы можете использовать библиотеку grapheme-splitter для этого:

https://github.com/orling/grapheme-splitter

Это делает правильное основанное на стандартах письмо, разделенное во всех сотнях экзотических крайних случаев - да, есть так много.

Ответ 6

Вы можете использовать регулярное выражение /(?!$)/:

"overpopulation".split(/(?!$)/)

Отрицательное утверждение вперед (?!$) будет соответствовать прямо перед каждым символом.

Ответ 7

Строка в Javascript уже является символьным массивом.

Вы можете просто получить доступ к любому символу в массиве, как и любой другой массив.

var s = "overpopulation";
alert(s[0]) // alerts o.

UPDATE

Как указано в комментариях ниже, вышеупомянутый метод доступа к символу в строке является частью ECMAScript 5, который некоторые браузеры могут не соответствовать.

Альтернативным методом, который вы можете использовать, является charAt(index).

var s = "overpopulation";
    alert(s.charAt(0)) // alerts o.

Ответ 8

Для поддержки emojis используйте этот

('Dragon 🐉').split(/(?!$)/u);

=> ['D', 'r', 'a', 'g', 'o', 'n', ' ', '🐉']