आप जावास्क्रिप्ट में एक स्ट्रिंग को कैरेक्टर ऐरे में कैसे बदलेंगे?
मैं "Hello world!"
सरणी की तरह एक स्ट्रिंग हो रही है सोच रहा हूँ
['H','e','l','l','o',' ','w','o','r','l','d','!']
आप जावास्क्रिप्ट में एक स्ट्रिंग को कैरेक्टर ऐरे में कैसे बदलेंगे?
मैं "Hello world!"
सरणी की तरह एक स्ट्रिंग हो रही है सोच रहा हूँ
['H','e','l','l','o',' ','w','o','r','l','d','!']
जवाबों:
नोट: यह यूनिकोड अनुरूप नहीं है।
"I💖U".split('')
4 वर्ण सरणी में परिणाम["I", "�", "�", "u"]
जो खतरनाक कीड़े पैदा कर सकता है। सुरक्षित विकल्पों के लिए नीचे दिए गए उत्तर देखें।
बस इसे एक खाली स्ट्रिंग द्वारा विभाजित करें।
var output = "Hello world!".split('');
console.log(output);
"randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
आपको स्ट्रिंग में वर्णों की संख्या नहीं बताती है, क्योंकि कुछ वर्ण दूसरों की तुलना में अधिक स्थान लेते हैं; str.length
आपको 16-बिट की संख्या बताता है।
जैसा कि हिप्पेट्रैइल सुझाव देता है , मध्यस्थ का जवाब सरोगेट जोड़े को तोड़ सकता है और "पात्रों" की गलत व्याख्या कर सकता है। उदाहरण के लिए:
// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]
मेरा सुझाव है कि इन चरित्र अनुक्रमों को सही ढंग से संभालने के लिए निम्न ES2015 विशेषताओं में से एक का उपयोग करना।
> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
u
झंडा> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
/(?=[\s\S])/u
इसके बजाय का उपयोग करें /(?=.)/u
क्योंकि .
newlines से मेल नहीं खाता ।
आप ES5.1 युग में अब भी कर रहे हैं (या यदि आपके ब्राउज़र सही ढंग से इस regex प्रबंधन नहीं करती है - एज की तरह), तो आप इस विकल्प का उपयोग कर सकते हैं (द्वारा transpiled कोलाहल ):
> '𝟘𝟙𝟚𝟛'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '𝟘', '𝟙', '𝟚', '𝟛' ]
ध्यान दें, कि बैबेल बेजोड़ सरोगेट्स को भी सही तरीके से संभालने की कोशिश करता है। हालांकि, यह बेजोड़ कम किराए के लिए काम नहीं करता है।
🏳️🌈
, और वर्णों से डायक्रिटिक्स चिह्न के संयोजन को विभाजित करता है। यदि आप वर्णों के बजाय अंगूर के समूहों में विभाजित करना चाहते हैं, तो stackoverflow.com/a/45238376 देखें ।
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
" के रूप में भी संदर्भित किया जाता है (उदाहरण के लिए PHP या रूबी में या " scatter
" (जैसे पायथन में )।
डेमो
आप भी इस्तेमाल कर सकते हैं Array.from
।
var m = "Hello world!";
console.log(Array.from(m))
इस विधि को ES6 में पेश किया गया है।
यह एक पुराना सवाल है, लेकिन मैं अभी तक सूचीबद्ध नहीं एक और समाधान के पार आया था।
आप वांछित आउटपुट प्राप्त करने के लिए Object.assign फ़ंक्शन का उपयोग कर सकते हैं:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
जरूरी नहीं कि सही हो या गलत, बस एक और विकल्प।
Array.from("Hello, world")
।
[..."Hello, world"]
यह पहले से ही है:
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'
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
।
charAt()
हालांकि मैं ऐरे-ईश संस्करण का उपयोग करना पसंद करूंगा। डारन आईई।
वहाँ (कम से कम) तीन अलग-अलग चीजें हैं जो आप एक "चरित्र" के रूप में गर्भ धारण कर सकते हैं, और परिणामस्वरूप, दृष्टिकोण की तीन अलग-अलग श्रेणियां जिन्हें आप उपयोग करना चाहते हैं।
जावास्क्रिप्ट स्ट्रिंग्स को मूल रूप से UTF-16 कोड इकाइयों के अनुक्रम के रूप में आविष्कार किया गया था, इतिहास के एक बिंदु पर वापस जब UTF-16 कोड इकाइयों और यूनिकोड कोड बिंदुओं के बीच एक-से-एक संबंध था। .length
एक स्ट्रिंग की संपत्ति UTF-16 कोड इकाइयों में इसकी लंबाई को मापती है, और जब आप करते someString[i]
हैं तो आपको i UTF-16 कोड इकाई मिल जाती है someString
।
नतीजतन, आप एक इंडेक्स के साथ सी-स्टाइल फॉर-लूप का उपयोग करके स्ट्रिंग से 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 कोड यूनिट्स से बने हैं, तो यह उन्हें अलग-अलग कोड यूनिट्स में विभाजित कर देगा, जो शायद आप नहीं चाहते। उदाहरण के लिए, स्ट्रिंग '𝟘𝟙𝟚𝟛'
चार यूनिकोड कोड पॉइंट (कोड पॉइंट 0x1D7D8 के माध्यम से 0x1D7DB) से बना है, जो कि UTF-16 में हैं, प्रत्येक दो UTF-16 कोड यूनिट से बना है। यदि हम उपरोक्त तरीकों का उपयोग करके उस स्ट्रिंग को विभाजित करते हैं, तो हमें आठ कोड इकाइयों की एक सरणी मिलेगी:
const yourString = '𝟘𝟙𝟚𝟛';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
इसलिए, शायद हम अपनी स्ट्रिंग को यूनिकोड कोड पॉइंट्स में विभाजित करना चाहते हैं! यह संभव हो गया है क्योंकि ECMAScript 2015 ने भाषा के लिए एक पुनरावृत्ति की अवधारणा को जोड़ा है । स्ट्रिंग्स अब पुनरावृत्तियाँ हैं, और जब आप उन पर पुनरावृति करते हैं (जैसे for...of
लूप के साथ ), तो आपको यूनिकोड कोड पॉइंट मिलते हैं, न कि 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);
हालाँकि, यूनिकोड कोड पॉइंट्स सबसे बड़ी संभव बात नहीं है जिसे संभवतः "चरित्र" भी माना जा सकता है । उन चीजों के कुछ उदाहरण जिन्हें एक "चरित्र" माना जा सकता है, लेकिन कई कोड बिंदुओं से मिलकर बने होते हैं:
हम नीचे देख सकते हैं कि अगर हम ऊपर दिए गए पुनरावृत्ति तंत्र के माध्यम से ऐसे वर्णों के साथ एक स्ट्रिंग को सरणी में बदलने की कोशिश करते हैं, तो वर्ण परिणामी सरणी में टूट जाते हैं। (यदि कोई भी पात्र आपके सिस्टम पर रेंडर नहीं करता है, तो yourString
नीचे एक कैपिटल ए के साथ एक तीव्र उच्चारण होता है, उसके बाद यूनाइटेड किंगडम का झंडा होता है, उसके बाद एक अश्वेत महिला होती है।)
const yourString = 'Á🇬🇧👩🏿';
const charArray = Array.from(yourString);
console.log(charArray);
यदि हम इनमें से प्रत्येक को अपने अंतिम सरणी में एकल आइटम के रूप में रखना चाहते हैं, तो हमें अंगूर की एक सरणी की आवश्यकता है कोड पॉइंट नहीं, बल्कि ।
जावास्क्रिप्ट के पास इसके लिए कोई अंतर्निहित समर्थन नहीं है - कम से कम अभी तक नहीं। इसलिए हमें एक पुस्तकालय की आवश्यकता है जो कोड बिंदुओं के संयोजन के लिए यूनिकोड नियमों को समझता और लागू करता है। सौभाग्य से, एक अस्तित्व में है: ओर्लिंग्स ग्रेफेम -स्प्लिटर । आप इसे npm के साथ स्थापित करना चाहेंगे या, यदि आप npm का उपयोग नहीं कर रहे हैं, तो index.js फ़ाइल डाउनलोड करें और इसे a के साथ सेवा दें<script>
टैग के । इस डेमो के लिए, मैं इसे jsDelivr से लोड करूँगा।
ग्रफीम-विभाजक हमें एक देता है GraphemeSplitter
तीन तरीकों के साथ वर्ग: splitGraphemes
, iterateGraphemes
, और countGraphemes
। स्वाभाविक रूप से, हम चाहते हैं 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>
और वहाँ हम हैं - तीन अंगूरों की एक सरणी, जो शायद आप चाहते थे।
आप स्ट्रिंग की लंबाई पर पुनरावृति कर सकते हैं और प्रत्येक स्थिति में चरित्र को धक्का दे सकते हैं :
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)
.split("")
करने से सबसे तेज विकल्प फिर से
.split("")
फ़ायरफ़ॉक्स में भारी अनुकूलित किया जा रहा है। जबकि लूप में क्रोम में समान प्रदर्शन होता है और छोटे और बड़े इनपुट के लिए फ़ायरफ़ॉक्स में फ़ायरफ़ॉक्स स्प्लिट काफी तेज होता है।
सरल उत्तर:
let str = 'this is string, length is >26';
console.log([...str]);
एक संभावना अगले है:
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(''));
इस बारे में कैसा है?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice काम भी करेगा।
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"𨭎".split('')
में परिणाम["�", "�"]
।