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

IT技术 javascript string
2021-01-24 21:46:27
var s = "overpopulation";
var ar = [];
ar = s.split();
alert(ar);

我想将一个单词 string.split 成字符数组。

上面的代码似乎不起作用 - 它返回“人口过剩”作为对象..

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

6个回答

您可以拆分空字符串:

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'
您还可以像这样访问数组中的字符串字符: mystr = "apples"; mystr[0]; // a
2021-03-30 21:46:27
这不考虑宽字符。
2021-04-08 21:46:27
这不适用于表情符号 "😒".length #=> 1 "😒".chars #=> ["😒"]
2021-04-11 21:46:27

老问题,但我应该警告:

不使用 .split('')

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

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

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

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

尽可能使用 ES2015 (ES6) 特性:

使用扩展运算符:

let arr = [...str];

或者 Array.from

let arr = Array.from(str);

或者split使用新的uRegExp 标志:

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()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 的好文章

感谢教我如何让我的正则表达式表情友好,直到现在我才知道我需要那个
2021-03-29 21:46:27
这应该是公认的答案。
2021-04-01 21:46:27
如果您想使用 ES6 但在 a 处拆分单词' ',而不是每个字符,该怎么办?
2021-04-03 21:46:27
@AlfaBravo 一样。
2021-04-06 21:46:27

这很简单:

s.split("");

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

不考虑宽字符。
2021-04-06 21:46:27

.split('') 会将表情符号一分为二。

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

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

还要考虑这个印地文文本“अनुच्छेद”,它是这样拆分的:

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

但实际上应该像这样拆分:

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

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

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

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

它在所有数百种奇特的边缘情况下进行了适当的基于标准的字母拆分 - 是的,有这么多。

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

所以:

s.split('')

会有你想要的效果。

更多信息在这里