如何将字符串拆分为字符数组?

时间:2011-06-26 14:49:49

标签: javascript string

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

我想将一个单词string.split转换为字符数组。

上面的代码似乎不起作用 - 它将“overpopulation”作为Object ..

返回

如果原始字符串不包含逗号和空格,我如何将其拆分为字符数组?

8 个答案:

答案 0 :(得分:196)

您可以拆分空字符串:

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'

答案 1 :(得分:65)

老问题,但我应该警告:

请勿使用.split('')

您将使用非BMP (非基本多语种平面)字符集获得奇怪的结果。

原因是.split().charCodeAt()等方法仅尊重代码点低于65536的字符; BEC。更高的代码点由一对(低值)&#34; 代理&#34;表示伪字符。

''.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 example来获取每个字符的正确代码点。

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

这需要knownCharCodeAt() function和某些浏览器;一个String.fromCodePoint() polyfill。

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的nice article

答案 2 :(得分:18)

这很简单:

s.split("");

分隔符是一个空字符串,因此它将在每个单个字符之间分解。

答案 3 :(得分:8)

javascript中的split()方法接受两个参数:分隔符和限制。 分隔符指定用于拆分字符串的字符。如果未指定分隔符,则返回整个字符串,不分隔。但是,如果将空字符串指定为分隔符,则在每个字符之间分配字符串。

因此:

s.split('')

会产生你想要的效果。

更多信息here

答案 4 :(得分:5)

您可以使用正则表达式/(?!$)/

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

负面前瞻断言(?!$)将在每个角色前面匹配。

答案 5 :(得分:4)

Javascript中的字符串已经是一个字符数组。

您可以像访问任何其他数组一样简单地访问数组中的任何字符。

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

<强>更新

正如下面的评论中所指出的,上述访问字符串中字符的方法是ECMAScript 5的一部分,某些浏览器可能不符合这些。

您可以使用的替代方法是charAt(index)

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

答案 6 :(得分:3)

支持表情符号使用此

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

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

答案 7 :(得分:2)

.split(&#39;&#39;)会将表情符号分成两半。

Onur的解决方案和正则表达式为一些表情符号提出的工作,但无法处理更复杂的语言或组合表情符号。 考虑一下这个表情符号被破坏了:

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

还要考虑这个印地语文本&#34;अनुच्छेद&#34;这是分开的:

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

但事实上应该像这样分开:

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

因为有些字符是组合标记(想想欧洲语言中的变音符号/重音符号)。

您可以使用字形分割器库:

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

它在所有数百种奇特的边缘案例中进行了适当的基于标准的字母分割 - 是的,有很多。