如何从字符串中获取字符数组?

IT技术 javascript arrays string
2021-01-26 03:17:59

在 JavaScript 中如何将字符串转换为字符数组?

我想得到一个像"Hello world!"数组一样的字符串
['H','e','l','l','o',' ','w','o','r','l','d','!']

6个回答

注意:这不符合 Unicode。"I💖U".split('')导致 4 个字符的数组["I", "�", "�", "u"],这可能会导致危险的错误。有关安全的替代方案,请参阅下面的答案。

只需将其拆分为空字符串即可。

var output = "Hello world!".split('');
console.log(output);

请参阅String.prototype.split()MDN 文档

聚会有点晚了。但是为什么有人想要制作一个字符串数组呢?一个字符串已经是一个数组还是我错了? "randomstring".length; //12 "randomstring"[2]; //"n"
2021-03-15 03:17:59
这不考虑代理对。"𨭎".split('')结果在["�", "�"].
2021-03-16 03:17:59
请参阅本主题其他地方的@hakatashi 的回答。希望每个人都看到这一点...不要使用这种方法,它不是 Unicode 安全的
2021-03-25 03:17:59
@LuigivanderPal 字符串不是数组,但非常相似。但是,它与字符数组不同。字符串类似于由 16 位数字组成的数组,其中一些代表字符,一些代表代理对的一半。例如,str.length不会告诉您字符串中的字符数,因为某些字符比其他字符占用更多空间;str.length告诉你 16 位数字的数量。
2021-03-28 03:17:59

正如hippietrail 所暗示的那样meder 的回答可以打破代理对并误解“字符”。例如:

// DO NOT USE THIS!
const a = '𝟘𝟙𝟚𝟛'.split('');
console.log(a);
// Output: ["�","�","�","�","�","�","�","�"]

我建议使用以下 ES2015 特性之一来正确处理这些字符序列。

传播语法(已由 insertusernamehere回答

const a = [...'𝟘𝟙𝟚𝟛'];
console.log(a);

数组.from

const a = Array.from('𝟘𝟙𝟚𝟛');
console.log(a);

正则表达式u标志

const a = '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u);
console.log(a);

使用/(?=[\s\S])/u而不是/(?=.)/u因为.不匹配换行符如果你还在 ES5.1 时代(或者你的浏览器不能正确处理这个正则表达式——比如 Edge),你可以使用以下替代方案(由Babel转译)。请注意,Babel 也尝试正确处理不匹配的代理。但是,这似乎不适用于无与伦比的低代理。

const a = '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
console.log(a);

Reduce 方法(已由 Mark Amery回答

const s = '𝟘𝟙𝟚𝟛';
const a = [];
for (const s2 of s) {
   a.push(s2);
}
console.log(a);

请注意,此解决方案拆分了一些表情符号,例如🏳️‍🌈, 并从字符中拆分组合变音符号标记。如果您想拆分为字形簇而不是字符,请参阅stackoverflow.com/a/45238376
2021-03-16 03:17:59
注意,尽管未分裂开代理对是很大的,它不是用于保持“字符”(或更准确地,通用溶液字形)在一起。一个字素可以由多个码点组成;例如,天城文语言的名称是“देवनागरी”,母语人士将其读为五个字素,但需要八个代码点才能产生...
2021-03-19 03:17:59
这个答案是由Mozilla官方文件在提到developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-30 03:17:59

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”(例如在PHPRuby 中或称为“ scatter”(例如在Python 中)。


演示

先试后买

如果您将扩展运算符与 ES5 的编译器结合使用,那么这在 IE 中将不起作用。考虑到这一点。我花了几个小时才弄清楚问题出在哪里。
2021-04-05 03:17:59

您也可以使用Array.from.

var m = "Hello world!";
console.log(Array.from(m))

这个方法已经在 ES6 中引入了。

参考

数组.from

这是一个老问题,但我遇到了另一个尚未列出的解决方案。

您可以使用 Object.assign 函数来获得所需的输出:

var output = Object.assign([], "Hello, world!");
console.log(output);
    // [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]

不一定对或错,只是另一种选择。

Object.assign 在 MDN 站点上有很好的描述。

@TJCrowder 那还有很长的路要走 [..."Hello, world"]
2021-03-27 03:17:59
这是一个很长的路要走Array.from("Hello, world")
2021-03-28 03:17:59
@chharvey - 呵呵。:-)
2021-03-28 03:17:59