Câu trả lời:
Lưu ý: Đây không phải là tuân thủ unicode. dẫn đến
"I💖U".split('')
mảng 4 ký tự["I", "�", "�", "u"]
có thể dẫn đến các lỗi nguy hiểm. Xem câu trả lời dưới đây để thay thế an toàn.
Chỉ cần tách nó bằng một chuỗi rỗng.
var output = "Hello world!".split('');
console.log(output);
"randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
không cho bạn biết số lượng ký tự trong chuỗi, vì một số ký tự chiếm nhiều không gian hơn các ký tự khác; str.length
cho bạn biết số lượng các số 16 bit.
Như hà mã gợi ý , câu trả lời của người trung gian có thể phá vỡ các cặp thay thế và giải thích sai các ký tự. Ví dụ:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
Tôi đề nghị sử dụng một trong các tính năng ES2015 sau đây để xử lý chính xác các chuỗi ký tự này.
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
u
Cờ RegExp> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Sử dụng /(?=[\s\S])/u
thay /(?=.)/u
vì vì .
không phù hợp với dòng mới .
Nếu bạn vẫn ở thời đại ES5.1 (hoặc nếu trình duyệt của bạn không xử lý chính xác biểu thức chính này - như Edge), bạn có thể sử dụng giải pháp thay thế này (được dịch bởi Babel ):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Lưu ý rằng Babel cũng cố gắng xử lý chính xác những người thay thế chưa từng có. Tuy nhiên, điều này dường như không hoạt động đối với những người thay thế thấp chưa từng có.
🏳️🌈
, và chia tách kết hợp dấu phụ từ ký tự. Nếu bạn muốn chia thành các cụm grapheme thay vì các ký tự, hãy xem stackoverflow.com/a/45238376 .
các spread
cú pháp
Bạn có thể sử dụng cú pháp lây lan , Bộ khởi tạo mảng được giới thiệu trong tiêu chuẩn ECMAScript 2015 (ES6) :
var arr = [...str];
Ví dụ
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);
Ba kết quả đầu tiên trong:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
Kết quả cuối cùng trong
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
Hỗ trợ trình duyệt
Kiểm tra bảng tương thích ECMAScript ES6 .
đọc thêm
spread
cũng được tham chiếu là " splat
" (ví dụ: trong PHP hoặc Ruby hoặc là " scatter
" (ví dụ: trong Python ).
Bản giới thiệu
Bạn cũng có thể sử dụng Array.from
.
var m = "Hello world!";
console.log(Array.from(m))
Phương pháp này đã được giới thiệu trong ES6.
Đây là một câu hỏi cũ nhưng tôi đã đi qua một giải pháp khác chưa được liệt kê.
Bạn có thể sử dụng hàm Object.assign để có đầu ra mong muốn:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
Không nhất thiết đúng hay sai, chỉ là một lựa chọn khác.
Array.from("Hello, world")
.
[..."Hello, world"]
Nó đã là:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
Hoặc đối với phiên bản thân thiện với trình duyệt cũ hơn, hãy sử dụng:
var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.
charAt()
mặc dù tôi muốn sử dụng biến thể mảng-ish. Chết tiệt IE.
Có (ít nhất) ba thứ khác nhau mà bạn có thể nghĩ là "nhân vật", và do đó, ba loại phương pháp khác nhau mà bạn có thể muốn sử dụng.
Các chuỗi JavaScript ban đầu được phát minh dưới dạng chuỗi các đơn vị mã UTF-16, quay lại một điểm trong lịch sử khi có mối quan hệ một-một giữa các đơn vị mã UTF-16 và các điểm mã Unicode. Các .length
tài sản của một chuỗi đo chiều dài của nó trong UTF-16 đơn vị mã, và khi bạn làm điều someString[i]
bạn nhận được i thứ đơn vị mã UTF-16 someString
.
Do đó, bạn có thể nhận được một mảng các đơn vị mã UTF-16 từ một chuỗi bằng cách sử dụng vòng lặp kiểu C với một biến chỉ mục ...
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
Ngoài ra còn có nhiều cách ngắn khác nhau để đạt được điều tương tự, như sử dụng .split()
với chuỗi rỗng làm dấu phân cách:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
Tuy nhiên, nếu chuỗi của bạn chứa các điểm mã được tạo thành từ nhiều đơn vị mã UTF-16, thì chuỗi này sẽ chia chúng thành các đơn vị mã riêng lẻ, có thể không phải là điều bạn muốn. Chẳng hạn, chuỗi '𝟘𝟙𝟚𝟛'
được tạo thành từ bốn điểm mã unicode (điểm mã 0x1D7D8 đến 0x1D7DB), trong UTF-16, mỗi điểm được tạo thành từ hai đơn vị mã UTF-16. Nếu chúng ta chia chuỗi đó bằng các phương thức trên, chúng ta sẽ nhận được một mảng gồm tám đơn vị mã:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
Vì vậy, có lẽ chúng tôi muốn chia chuỗi của chúng tôi thành Điểm Mã Unicode! Điều đó là có thể kể từ khi ECMAScript 2015 bổ sung khái niệm lặp lại cho ngôn ngữ. Các chuỗi bây giờ là các for...of
vòng lặp và khi bạn lặp lại chúng (ví dụ với một vòng lặp), bạn sẽ nhận được các điểm mã Unicode, không phải các đơn vị mã UTF-16:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
Chúng ta có thể rút ngắn điều này bằng cách sử dụng Array.from
, lặp đi lặp lại qua lần lặp mà nó được thông qua hoàn toàn:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);
Tuy nhiên, điểm mã unicode không phải là điều lớn nhất có thể mà có thể được coi là một "nhân vật" trong hai . Một số ví dụ về những thứ có thể được coi là một "ký tự" hợp lý nhưng được tạo thành từ nhiều điểm mã bao gồm:
Chúng ta có thể thấy bên dưới rằng nếu chúng ta cố gắng chuyển đổi một chuỗi có các ký tự như vậy thành một mảng thông qua cơ chế lặp ở trên, các ký tự sẽ bị phá vỡ trong mảng kết quả. (Trong trường hợp bất kỳ nhân vật nào không hiển thị trên hệ thống của bạn, yourString
bên dưới bao gồm một chữ A có dấu trọng âm, theo sau là cờ của Vương quốc Anh, theo sau là một phụ nữ da đen.)
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
Nếu chúng ta muốn giữ mỗi thứ này như một mục duy nhất trong mảng cuối cùng của chúng ta, thì chúng ta cần một mảng các biểu đồ , không phải các điểm mã.
JavaScript không có hỗ trợ tích hợp cho việc này - ít nhất là chưa. Vì vậy, chúng ta cần một thư viện hiểu và thực hiện các quy tắc Unicode cho sự kết hợp các điểm mã nào tạo thành một biểu đồ. May mắn thay, người ta tồn tại: bộ tách đồ thị của orling . Bạn sẽ muốn cài đặt nó với npm hoặc, nếu bạn không sử dụng npm, hãy tải xuống tệp index.js và cung cấp nó với một <script>
thẻ. Đối với bản demo này, tôi sẽ tải nó từ jsDelivr.
grapheme-splitter cho chúng ta một GraphemeSplitter
lớp học với ba phương pháp: splitGraphemes
, iterateGraphemes
, và countGraphemes
. Đương nhiên, chúng tôi muốn 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>
Và chúng tôi ở đó - một mảng gồm ba biểu đồ, có lẽ là những gì bạn muốn.
Bạn có thể lặp theo chiều dài của chuỗi và đẩy ký tự ở mỗi vị trí :
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))
"😃".charAt(0)
sẽ trả lại một nhân vật không thể sử dụng
.split("")
tùy chọn nhanh nhất trở lại
.split("")
có vẻ được tối ưu hóa mạnh mẽ trong firefox. Trong khi vòng lặp có hiệu suất tương tự trong chrome và phân chia firefox nhanh hơn đáng kể trong firefox cho các đầu vào nhỏ và lớn.
câu trả lời đơn giản:
let str = 'this is string, length is >26';
console.log([...str]);
Một khả năng là tiếp theo:
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(''));
Còn cái này thì sao?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice cũng sẽ làm việc.
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')
kết quả trong["�", "�"]
.