Bir dizeyi JavaScript'te bir karakter dizisine nasıl dönüştürürsünüz?
"Hello world!"
Dizi gibi bir dize almayı düşünüyorum
['H','e','l','l','o',' ','w','o','r','l','d','!']
Bir dizeyi JavaScript'te bir karakter dizisine nasıl dönüştürürsünüz?
"Hello world!"
Dizi gibi bir dize almayı düşünüyorum
['H','e','l','l','o',' ','w','o','r','l','d','!']
Yanıtlar:
Not: Bu unicode uyumlu değildir. tehlikeli
"I💖U".split('')
karakterlere["I", "�", "�", "u"]
yol açabilecek 4 karakter dizisiyle sonuçlanır. Güvenli alternatifler için aşağıdaki yanıtlara bakın.
Boş bir dize ile bölün.
var output = "Hello world!".split('');
console.log(output);
"randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
bazı karakterler diğerlerinden daha fazla yer kapladığından, dizedeki karakter sayısını size söylemez; str.length
size 16 bitlik sayıların sayısını söyler.
Gibi hippietrail anlaşılacağı , Meder cevabı vekil çiftleri ve yanlış anlaşılabilir kırabilir “karakterlerini.” Örneğin:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
Bu karakter dizilerini doğru şekilde işlemek için aşağıdaki ES2015 özelliklerinden birini kullanmanızı öneririm.
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
u
bayrağı> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Kullanım /(?=[\s\S])/u
yerine /(?=.)/u
çünkü .
yeni satır uymuyor .
Hala ES5.1 çağındaysanız (veya tarayıcınız bu regex'i Edge gibi doğru şekilde işlemiyorsa ) bu alternatifi kullanabilirsiniz ( Babel tarafından aktarılır ):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
Unutmayın ki Babel, eşsiz vekilleri doğru bir şekilde ele almaya çalışmaktadır. Ancak, bu eşsiz düşük taşıyıcılar için işe yaramıyor gibi görünüyor.
🏳️🌈
, karakterlerdeki aksan işaretlerini birleştiren gibi bazı emojiler ayırdığını unutmayın . Karakterler yerine grafik kümelerine bölünmek istiyorsanız, bkz. Stackoverflow.com/a/45238376 .
spread
Sözdizimi
ECMAScript 2015 (ES6) standardında tanıtılan bir Array Initializer olan forma sözdizimini kullanabilirsiniz :
var arr = [...str];
Örnekler
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);
İlk üç sonuç:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
Sonuncusu
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
Tarayıcı Desteği
ECMAScript ES6 uyumluluk tablosunu kontrol edin .
daha fazla okuma
spread
" splat
" (örn. PHP veya Ruby'de veya " scatter
" olarak da adlandırılır (örneğin Python'da ).
gösteri
Ayrıca kullanabilirsiniz Array.from
.
var m = "Hello world!";
console.log(Array.from(m))
Bu yöntem ES6'da tanıtıldı.
Bu eski bir soru ama henüz listelenmemiş başka bir çözümle karşılaştım.
İstenen çıktıyı elde etmek için Object.assign işlevini kullanabilirsiniz:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
Mutlaka doğru ya da yanlış değil, sadece başka bir seçenek.
Array.from("Hello, world")
.
[..."Hello, world"]
Zaten:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
Veya daha eski bir tarayıcı dostu sürüm için şunu kullanın:
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()
dizi-ish değişkenini kullanmayı tercih etsem de. Lanet IE.
Bir "karakter" olarak düşünebileceğiniz (en azından) üç farklı şey ve sonuç olarak kullanmak isteyebileceğiniz üç farklı yaklaşım kategorisi vardır.
JavaScript dizeleri, UTF-16 kod birimleri ile Unicode kod noktaları arasında bire bir ilişki olduğunda, geçmişte bir noktada UTF-16 kod birimlerinin dizileri olarak icat edildi. .length
Bir dize özellik UTF-16 kod birimleri uzunluğunu ölçer ve bunu yaptığında someString[i]
almak i th UTF-16 kod birimi someString
.
Sonuç olarak, bir dizin değişkenli bir C stili for-loop kullanarak bir dizeden UTF-16 kod birimleri dizisi alabilirsiniz ...
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
Aynı şeyi elde etmenin çeşitli kısa yolları da vardır, örneğin .split()
boş dize ile ayırıcı olarak kullanmak:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
Bununla birlikte, dizeniz birden fazla UTF-16 kod biriminden oluşan kod noktaları içeriyorsa, bu kodlar bunları tek tek kod birimlerine böler; Örneğin, dize '𝟘𝟙𝟚𝟛'
UTF-16'da her biri iki UTF-16 kod biriminden oluşan dört adet unicode kod noktasından (kod noktaları 0x1D7D8 - 0x1D7DB) oluşur. Bu dizeyi yukarıdaki yöntemleri kullanarak bölersek, sekiz kodluk bir dizi alırız:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
Belki de dizemizi Unicode Kod Noktalarına bölmek istiyoruz! ECMAScript 2015 , dile yinelenebilir bir kavram eklediğinden bu mümkün oldu . Dizeler artık yinelenebilir ve üzerlerinde yineleme yaptığınızda (örneğin bir for...of
döngü ile), UTF-16 kod birimleri yerine Unicode kod noktaları elde edersiniz:
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
Array.from
Örtük olarak geçirildiği yinelenebilir üzerinde yinelenen bu kullanımı kısaltabiliriz :
const yourString = '𝟘𝟙𝟚𝟛';
const charArray = Array.from(yourString);
console.log(charArray);
Ancak, unicode kod noktaları "karakter" olarak da düşünülebilecek olası en büyük şey değildir . Tek bir "karakter" olarak düşünülebilecek, ancak birden fazla kod noktasından oluşabilecek bazı örneklere şunlar dahildir:
Aşağıda, bu tür karakterleri olan bir dizeyi yukarıdaki yineleme mekanizması aracılığıyla bir diziye dönüştürmeye çalışırsak, sonuçta oluşan dizide karakterlerin parçalandığını görebiliriz. (Karakterlerin herhangi birinin sisteminizde görüntülenmemesi durumunda, yourString
aşağıda akut aksanlı bir başkent A , ardından İngiltere bayrağı ve ardından siyah bir kadın bulunur.)
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
Bunların her birini son dizimizde tek bir öğe olarak tutmak istiyorsak , kod noktalarına değil , bir grafik dizisine ihtiyacımız var .
JavaScript'in bunun için yerleşik bir desteği yoktur - en azından henüz. Bu nedenle, Unicode kurallarını anlayan ve uygulayan bir kitaplığa ihtiyacımız var. Neyse ki, biri var: orling'in grapheme-splitter . Npm ile yüklemek veya npm kullanmıyorsanız index.js dosyasını indirin ve bir <script>
etiketle sunun . Bu demo için jsDelivr'den yükleyeceğim.
sesletim-ayırıcı bize verir GraphemeSplitter
: üç yöntemleri ile sınıf splitGraphemes
, iterateGraphemes
ve countGraphemes
. Doğal olarak istiyoruz 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>
Ve işte buradayız - muhtemelen istediğin şey olan üç grafik dizisi .
Dizenin uzunluğu boyunca yineleme yapabilir ve karakteri her bir konuma itebilirsiniz :
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)
kullanılamaz bir karakter döndürür
.split("")
en hızlı seçeneği tekrar yapar
.split("")
firefox'ta büyük ölçüde optimize edilmiş gibi görünüyor. Döngü kromda benzer performansa sahipken, firefox bölmesi firefox'ta küçük ve büyük girdiler için önemli ölçüde daha hızlıdır.
basit cevap:
let str = 'this is string, length is >26';
console.log([...str]);
Bir olasılık bir sonraki:
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(''));
Buna ne dersin?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice da işi yapacak.
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')
ile sonuçlanır["�", "�"]
.