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

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

我在想获取一个像"Hello world!"这样的字符串到数组
['H','e','l','l','o',' ','w','o','r','l','d','!'] < / p >
425958 次浏览

注意:这是不符合unicode的。"I💖U".split('')的结果 4个字符数组["I", "�", "�", "u"],这可能导致危险 bug。

.

.

只要用一个空字符串分割它。

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

参见String.prototype.split() MDN文档

它已经是:

var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'

或者对于更老的浏览器友好版本,使用:

var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'

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中)。


演示

买前先试试

作为hippietrail建议地中海的回答可以中断 替代对和误解“字符”。例如:< / p >

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

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

扩展语法(已经回答了 by insertusernamehere)

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

Array.from

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

< a href = " https://babeljs。io/docs/learn-es2015#unicode" rel="noreferrer">RegExp u flag . xml

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

使用/(?=[\s\S])/u代替/(?=.)/u,因为.不匹配 换行< / >。如果你还在ES5.1时代(或者你的浏览器没有 正确处理这个正则表达式-像边缘),你可以使用下面的替代方案 (由巴别塔转译)。注意,Babel也试图处理unmatched 正确的代理人。然而,这似乎并不适用于无与伦比的低 代理人。< / p >

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

Reduce方法(已经回答了 by Mark Amery)

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

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

你可以使用对象。指定函数以获得所需的输出:

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

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

对象。assign在MDN站点描述得很好

你可以遍历字符串的长度并推入每个位置的人物:

const str = 'Hello World';


const stringToArray = (text) => {
var chars = [];
for (var i = 0; i < text.length; i++) {
chars.push(text[i]);
}
return chars
}


console.log(stringToArray(str))

你也可以使用Array.from

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

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

参考

Array.from

这个怎么样?

function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}

简单的回答是:

let str = 'this is string, length is >26';


console.log([...str]);

Array.prototype.slice也会做这个工作。

const result = Array.prototype.slice.call("Hello world!");
console.log(result);

(至少)有三种不同的东西可以想象为“角色”,因此,你可能会使用三种不同的方法类别。

拆分为UTF-16代码单元

JavaScript字符串最初是作为UTF-16代码单元的序列发明的,在历史上,UTF-16代码单元和Unicode代码点之间存在一对一的关系。字符串的.length属性以UTF-16代码单位度量其长度,当执行someString[i]时,将得到someString的__abc4个UTF-16代码单位。

因此,您可以通过使用带有索引变量的c风格for循环从字符串中获得UTF-16代码单元数组…

const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);

也有各种简单的方法来实现同样的事情,比如使用.split()并将空字符串作为分隔符:

const charArray = 'Hello, World!'.split('');
console.log(charArray);

但是,如果字符串包含由多个UTF-16代码单元组成的代码点,这将把它们分割成单独的代码单元,这可能不是您想要的结果。例如,字符串'𝟘𝟙𝟚𝟛'由四个unicode代码点(代码点0x1D7D8到0x1D7DB)组成,在UTF-16中,每个代码点由两个UTF-16代码单元组成。如果我们使用上面的方法拆分字符串,我们将得到一个包含8个代码单元的数组:

const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);

拆分为Unicode代码点

因此,也许我们希望将字符串拆分为Unicode代码点!自从ECMAScript 2015在语言中添加了可迭代的的概念以来,这就成为了可能。字符串现在是可迭代对象,当你遍历它们时(例如使用for...of循环),你得到的是Unicode代码点,而不是UTF-16代码单元:

const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);

我们可以使用Array.from来缩短这个值,它在隐式传递的可迭代对象上迭代:

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

然而,unicode码位并不是可能被认为是“字符”要么的最大可能的东西。一些可以合理地认为是单个“字符”但由多个编码点组成的东西的例子包括:

  • 重音字符,如果重音与组合码位一起应用
  • 旗帜
  • 一些emojis

我们可以在下面看到,如果我们试图通过上面的迭代机制将具有此类字符的字符串转换为数组,则字符最终会在结果数组中被分解。(以防任何字符无法在您的系统上显示,下面的yourString由带有尖锐口音的大写一个组成,后面跟着英国国旗,后面跟着一个黑人妇女。)

const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);

如果我们想在最终数组中保留每一个元素,那么我们需要一个字母数组,而不是代码点数组。

分裂成字素

JavaScript还没有对此提供内置支持——至少目前还没有。因此,我们需要一个能够理解并实现Unicode规则的库,以确定哪些代码点的组合构成一个字素。幸运的是,有一个存在:orling的grapheme-splitter。你会想要用npm安装它,或者,如果你不使用npm,下载index.js文件并使用<script>标记提供它。对于这个演示,我将从jsDelivr加载它。

grapheme-splitter提供了一个GraphemeSplitter类,它有三个方法:splitGraphemesiterateGraphemescountGraphemes。自然,我们需要splitGraphemes:

const splitter = new GraphemeSplitter();
const yourString = 'Á🇬🇧👩🏿';
const charArray = splitter.splitGraphemes(yourString);
console.log(charArray);
<script src="https://cdn.jsdelivr.net/npm/grapheme-splitter@1.0.4/index.js"></script>

And there we are - an array of three graphemes, which is probably what you wanted.

一种可能是:

console.log([1, 2, 3].map(e => Math.random().toString(36).slice(2)).join('').split('').map(e => Math.random() > 0.5 ? e.toUpperCase() : e).join(''));

ES6将字符串按字符分割为数组的方法是使用展开操作符。它既简单又漂亮。

array = [...myString];


例子:

let myString = "Hello world!"
array = [...myString];
console.log(array);


// another example:


console.log([..."another splitted text"]);

在JavaScript中转换字符串为字符数组的4种方法:

const string = 'word';


// Option 1
string.split('');  // ['w', 'o', 'r', 'd']


// Option 2
[...string];  // ['w', 'o', 'r', 'd']


// Option 3
Array.from(string);  // ['w', 'o', 'r', 'd']


// Option 4
Object.assign([], string);  // ['w', 'o', 'r', 'd']