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

DrS*_*ove 113 javascript string

var s = "overpopulation";
var ar = [];
ar = s.split();
alert(ar);
Run Code Online (Sandbox Code Playgroud)

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

上面的代码似乎不起作用 - 它将"overpopulation"作为Object返回..

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

lon*_*day 206

您可以拆分空字符串:

var chars = "overpopulation".split('');
Run Code Online (Sandbox Code Playgroud)

如果您只想以类似数组的方式访问字符串,则可以在不执行以下操作的情况下执行此操作split:

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

您还可以使用常规数组语法访问每个字符及其索引.但请注意,字符串是不可变的,这意味着您无法使用此方法设置字符的值,并且IE7不支持它(如果这仍然对您很重要).

var s = "overpopulation";

console.log(s[3]); // logs 'r'
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于emojis"".length#=> 1"".chars#=> [""] (6认同)
  • 你也可以像时尚一样访问数组中的字符串字符:`mystr ="apples"; myStr的[0]; //一个 (3认同)
  • 这不考虑宽字符. (3认同)

Onu*_*rım 80

老问题,但我应该警告:

不使用 .split('')

使用非BMP(非基本多语言平面)字符集会得到奇怪的结果.

原因是方法喜欢.split()并且.charCodeAt()只尊重代码点低于65536的字符; BEC.更高的代码点由一对(较低值)" 代理 "伪字符表示.

''.length     // —> 6
''.split('')  // —> ["?", "?", "?", "?", "?", "?"]

''.length      // —> 2
''.split('')   // —> ["?", "?"]
Run Code Online (Sandbox Code Playgroud)

尽可能使用ES2015(ES6)功能:

使用传播运算符:

let arr = [...str];
Run Code Online (Sandbox Code Playgroud)

要么 Array.from

let arr = Array.from(str);
Run Code Online (Sandbox Code Playgroud)

或者split使用新的uRegExp标志:

let arr = str.split(/(?!$)/u);
Run Code Online (Sandbox Code Playgroud)

例子:

[...'']        // —> ["", "", ""]
[...'']     // —> ["", "", ""]
Run Code Online (Sandbox Code Playgroud)

对于ES5,选项有限:

我想出了这个函数,它在内部使用MDN示例来获取每个字符的正确代码点.

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

这需要knownCharCodeAt()功能和一些浏览器; 一个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("");
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

stringToArray('')     // —> ["", "", ""]
stringToArray('')  // —> ["", "", ""]
Run Code Online (Sandbox Code Playgroud)

注意:str[index](ES5)并且str.charAt(index)还将返回非BMP字符集的奇怪结果.例如''.charAt(0)回归"?".

更新:阅读这篇关于JS和unicode的好文章.


pim*_*vdb 18

它很简单:

s.split("");
Run Code Online (Sandbox Code Playgroud)

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

  • 不考虑宽字符。 (2认同)

Dia*_*ita 8

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

因此:

s.split('')
Run Code Online (Sandbox Code Playgroud)

会有你想要的效果.

更多信息在这里


Mur*_*sli 7

要支持表情符号,请使用此

('Dragon ').split(/(?!$)/u);
Run Code Online (Sandbox Code Playgroud)

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


Orl*_*iev 7

.split('')将表情符号分割成两半。

Onur的解决方案和regex提出的针对某些表情符号的建议工作,但是无法处理更复杂的语言或组合的表情符号。考虑一下这个表情符号被破坏了:

[..."??"] // returns ["", "?", "?", ""]  instead of ["??"]
Run Code Online (Sandbox Code Playgroud)

还要考虑此印地语文字“ ????????” 像这样拆分:

[..."????????"]  // returns   ["?", "?", "?", "?", "?", "?", "?", "?"]
Run Code Online (Sandbox Code Playgroud)

但实际上应该这样分割:

["?","??","??","??","?"]
Run Code Online (Sandbox Code Playgroud)

因为某些字符正在组合标记(例如欧洲语言中的变音符号/重音符号)。

您可以为此使用grapheme-splitter库:

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

它在所有数百种特殊的边缘情况中都进行了适当的基于标准的字母拆分-是的,数量很多。


Gum*_*mbo 5

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

"overpopulation".split(/(?!$)/)
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*xon 5

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

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

var s = "overpopulation";
alert(s[0]) // alerts o.
Run Code Online (Sandbox Code Playgroud)

更新

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

您可以使用的另一种方法是charAt(index)

var s = "overpopulation";
    alert(s.charAt(0)) // alerts o.
Run Code Online (Sandbox Code Playgroud)

  • 不过,这并不适用于所有浏览器(不适用于某些版本的IE:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String#section_5。 (2认同)