আপনি কীভাবে জাভাস্ক্রিপ্টের একটি অক্ষরের অ্যারেতে একটি স্ট্রিং পাবেন?


369

আপনি কীভাবে জাভাস্ক্রিপ্টে একটি স্ট্রিংকে একটি অক্ষর অ্যারে রূপান্তর করবেন?

আমি ভাবছি "Hello world!"অ্যারের মতো স্ট্রিং পাচ্ছি
['H','e','l','l','o',' ','w','o','r','l','d','!']

উত্তর:


492

দ্রষ্টব্য: এটি ইউনিকোড অনুসারে নয়। "I💖U".split('')4 টি চরিত্রের অ্যারেতে ফলাফল ["I", "�", "�", "u"]যা বিপজ্জনক বাগের দিকে নিয়ে যেতে পারে। নিরাপদ বিকল্পের জন্য নীচের উত্তরগুলি দেখুন।

এটি খালি স্ট্রিং দ্বারা বিভক্ত করুন।

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

দেখুন String.prototype.split()MDN ডক্স


31
এটি সারোগেট জোড়াগুলিতে বিবেচনা করে না। "𨭎".split('')ফলাফল ["�", "�"]
হিপ্পিট্রেইল

59
এই থ্রেডে অন্য কোথাও @ হাকতশির উত্তর দেখুন। আশা করি প্রত্যেকে এটি দেখতে পাবে ... এই
পদ্ধতিটি

3
বিট দেরিতে পার্টিতে। তবে কেউ কেন কখনও স্ট্রিংয়ের অ্যারে তৈরি করতে চান? একটি স্ট্রিং ইতিমধ্যে একটি অ্যারে বা আমি ভুল করছি? "randomstring".length; //12 "randomstring"[2]; //"n"
লুইজি ভ্যান ডের পাল

4
@ লুইজিভেন্ডারপাল একটি স্ট্রিং একটি অ্যারে নয়, তবে এটি খুব মিল। তবে এটি অক্ষরের অ্যারেটির মতো নয়। একটি স্ট্রিং 16-বিট সংখ্যার অ্যারের সাথে সমান, যার মধ্যে কয়েকটি অক্ষর এবং কিছুগুলি একটি সারোগেট জুটির অর্ধেক উপস্থাপন করে। উদাহরণস্বরূপ, str.lengthস্ট্রিংয়ের অক্ষরের সংখ্যা আপনাকে বলে না, যেহেতু কিছু অক্ষর অন্যের চেয়ে বেশি স্থান নেয়; str.lengthআপনাকে 16-বিট সংখ্যার সংখ্যা বলে।
থিওডোর নরভেল

289

হিসাবে hippietrail প্রস্তাব দেওয়া , মেডার এর উত্তর ভাড়াটে জোড়া এবং অপব্যাখ্যা করে বিরতি করতে পারেন "অক্ষর।" উদাহরণ স্বরূপ:

// DO NOT USE THIS!
> '𝟘𝟙𝟚𝟛'.split('')
[ '�', '�', '�', '�', '�', '�', '�', '�' ]

এই অক্ষর ক্রমগুলি সঠিকভাবে পরিচালনা করতে আমি নিম্নলিখিত ES2015 টি বৈশিষ্ট্য ব্যবহার করার পরামর্শ দিচ্ছি।

ছড়িয়ে পড়া সিনট্যাক্স ( ইতিমধ্যে সন্নিবেশকারী নাম দ্বারা জবাব দেওয়া হয়েছে)

> [...'𝟘𝟙𝟚𝟛']
[ '𝟘', '𝟙', '𝟚', '𝟛' ]

Array.from

> Array.from('𝟘𝟙𝟚𝟛')
[ '𝟘', '𝟙', '𝟚', '𝟛' ]

RegExp uপতাকা

> '𝟘𝟙𝟚𝟛'.split(/(?=[\s\S])/u)
[ '𝟘', '𝟙', '𝟚', '𝟛' ]

ব্যবহার /(?=[\s\S])/uপরিবর্তে/(?=.)/u কারণ .নতুন লাইনের সাথে মেলে না

আপনি যদি এখনও ES5.1 যুগে থাকেন (বা যদি আপনার ব্রাউজারটি এই রেজেক্সকে সঠিকভাবে পরিচালনা করে না - এজ হিসাবে) তবে আপনি এই বিকল্পটি ব্যবহার করতে পারেন (দ্বারা প্রতিস্থাপিত) ব্যাবেল ):

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

দ্রষ্টব্য, বাবেলটিও তুলনামূলকভাবে সারোগেটগুলি হ্যান্ডেল করার চেষ্টা করে। যাইহোক, এটি তুলনামূলকভাবে কম সারোগেটের জন্য কাজ করবে বলে মনে হচ্ছে না।

আপনার ব্রাউজারে সমস্ত পরীক্ষা করুন:


আপনি এই চরিত্রগুলি কীভাবে গঠন করেছেন? দেখে মনে হচ্ছে প্রতিটি চরিত্র 4 বাইট।
user420667

2
@ ব্যবহারকারী420667 অক্ষরগুলি একটি অতিরিক্ত অক্ষর সমতল থেকে (ইউনিকোড টেবিলের) "বড়" কোডপয়েন্ট সহ রয়েছে সুতরাং সেগুলি 16 বাইটে ফিট করে না। জাভাস্ক্রিপ্টে ব্যবহৃত ইউটিএফ -16 এনকোডিং এই অক্ষরগুলিকে সরোগেট জোড় হিসাবে উপস্থাপন করে (বিশেষ অক্ষর যা অতিরিক্ত প্লেন থেকে অন্যান্য অক্ষর গঠনে কেবল জোড়া হিসাবে ব্যবহৃত হয়)। কেবল অক্ষরগুলি প্রধান চর্যাটার বিমানটি 16 বাইট সহ উপস্থাপিত হয়। অগ্রণী জুটির বিশেষ অক্ষরগুলি মূল চরিত্রের বিমান থেকেও যদি এটি বোঝা দেয়।
ওলগা

1
বিভিন্ন প্রযুক্তির পারফরম্যান্স , স্প্রেড অপ চ্যাম্পের মতো দেখায় (ক্রোম 58)।
অ্যাড্রিয়েন

4
নোট করুন যে এই সমাধানটি কিছু ইমোজি যেমন 🏳️‍🌈বিভক্ত করে এবং অক্ষরগুলি থেকে ডায়াক্রিটিক্স চিহ্নকে সংযুক্ত করে বিভক্ত করে। আপনি যদি অক্ষরের পরিবর্তে গ্রাফিম ক্লাস্টারে বিভক্ত করতে চান তবে stackoverflow.com/a/45238376 দেখুন
ব্যবহারকারী 202729

3
মনে রাখবেন সরোগেট জোড় না ভাঙার সময় দুর্দান্ত, এটি "অক্ষর" (বা আরও সঠিকভাবে, গ্রাফিক্স ) একসাথে রাখার জন্য সাধারণ উদ্দেশ্য সমাধান নয় । একাধিক কোড পয়েন্ট দিয়ে একটি গ্রাফি তৈরি করা যেতে পারে; উদাহরণস্বরূপ, দেবনাগরী ভাষার নাম "দেবনাগর", যা স্থানীয় বক্তা পাঁচটি গ্রাফি হিসাবে পড়েন, তবে এটি তৈরি করতে আটটি কোড পয়েন্ট নেয় ...
টিজে ক্রাউডার

71

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" হিসাবেও উল্লেখ করা হয় (যেমন পিএইচপি বা রুবি বা " scatter" হিসাবে (যেমন পাইথনে )।


ডেমো

কেনার আগে চেষ্টা করুন


1
আপনি যদি ES5 তে একটি সংকলকের সাথে সংমিশ্রণে স্প্রেড অপারেটর ব্যবহার করেন তবে এই অভ্যাসটি IE এ কাজ করবে না। এটা বিবেচনায় নিন। সমস্যাটি কী তা বুঝতে সময় লাগল।
স্টিফ ভ্যান ডেন বার্গ


10

এটি একটি পুরানো প্রশ্ন তবে আমি অন্য একটি সমাধান পেয়েছি যা এখনও তালিকাভুক্ত নয়।

পছন্দসই আউটপুট পেতে আপনি অবজেক্ট.সেসাইন ফাংশনটি ব্যবহার করতে পারেন:

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

অগত্যা সঠিক বা ভুল নয়, কেবল অন্য একটি বিকল্প।

অবজেক্ট.সেসাইন এমডিএন সাইটে ভাল বর্ণনা করা হয়েছে।


2
এটি পেতে অনেক দীর্ঘ পথ Array.from("Hello, world")
টিজে ক্রাউডার

@ টিজে ক্রাউডার এটাই অনেক দীর্ঘ পথ[..."Hello, world"]
ছারভে

@ ছারভে - হি। :-)
টিজে ক্রাউডার

9

এটি ইতিমধ্যে:

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'


4
-1: এটা না। এটি ব্যবহার করে দেখুন:alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
আর মার্টিনহো ফার্নান্দেস

4
দুঃখিত। আমি অনুমান করি আমি যা বলতে চাইছিলাম তা হ'ল: "আপনি অক্ষরের অ্যারে তৈরি না করে সূচী রেফারেন্স দ্বারা স্বতন্ত্র অক্ষরগুলিতে অ্যাক্সেস করতে পারেন"।
ডানসিমাউ

3
নির্ভরযোগ্যভাবে ক্রস ব্রাউজার নয় যা আপনি পারবেন না। এটি একটি ইসমাস্ক্রিপ্ট পঞ্চম সংস্করণ বৈশিষ্ট্য।
বোবিনস

8
ক্রস ব্রাউজার সংস্করণ হয় mystring.charAt(index)
psmay

1
+1 এর জন্য - charAt()যদিও আমি অ্যারে-ইশ রূপটি ব্যবহার করতে পছন্দ করি। ডার্ন আইই।
Zanexer

4

আপনি "চরিত্র" হিসাবে ধারণা করতে পারেন এমন তিনটি পৃথক জিনিস রয়েছে (এবং কমপক্ষে) এবং ফলস্বরূপ, আপনি ব্যবহার করতে চাইতে পারেন এমন তিনটি ভিন্ন ধরণের পদ্ধতির।

ইউটিএফ -16 কোড ইউনিটে বিভক্ত

জাভাস্ক্রিপ্ট স্ট্রিংগুলি মূলত ইউটিএফ -16 কোড ইউনিটের ক্রম হিসাবে উদ্ভাবিত হয়েছিল, ইতিহাসের এক পর্যায়ে যখন ইউটিএফ -16 কোড ইউনিট এবং ইউনিকোড কোড পয়েন্টের মধ্যে একের মধ্যে সম্পর্ক ছিল relationship .lengthএকটি স্ট্রিং এর সম্পত্তি হল UTF-16 কোড এককে তার দৈর্ঘ্য পরিমাপ করে, এবং যখন আপনি কি someString[i]আপনি পেতে আমি এর ম হল UTF-16 কোড ইউনিট someString

ফলস্বরূপ, আপনি ইনডেক্স ভেরিয়েবলের সাথে সি-স্টাইলের জন্য লুপ ব্যবহার করে স্ট্রিং থেকে ইউটিএফ -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);

তবে, যদি আপনার স্ট্রিংয়ে কোড পয়েন্ট থাকে যা একাধিক ইউটিএফ -16 কোড ইউনিট নিয়ে গঠিত হয়, এটি তাদের পৃথক কোড ইউনিটে বিভক্ত করবে, যা আপনি চান নাও হতে পারে। উদাহরণস্বরূপ, স্ট্রিংটি '𝟘𝟙𝟚𝟛'চারটি ইউনিকোড কোড পয়েন্ট (0x1D7D8 এর মাধ্যমে কোড পয়েন্ট 0x1D7D8) দিয়ে গঠিত যা ইউটিএফ -16 এ প্রতিটি দুটি ইউটিএফ -16 কোড ইউনিট নিয়ে গঠিত। যদি আমরা উপরের পদ্ধতিগুলি ব্যবহার করে সেই স্ট্রিংটি বিভক্ত করি তবে আমরা আটটি কোড ইউনিটের একটি অ্যারে পাব:

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

ইউনিকোড কোড পয়েন্টে বিভক্ত করা

সুতরাং, সম্ভবত আমরা পরিবর্তে আমাদের স্ট্রিংটি ইউনিকোড কোড পয়েন্টগুলিতে বিভক্ত করতে চাই! ECMAScript 2015 ভাষায় পুনরাবৃত্তির ধারণা যুক্ত করার পরে এটি সম্ভব হয়েছে । স্ট্রিংগুলি এখন পুনরাবৃত্তিযোগ্য এবং আপনি যখন সেগুলি দিয়ে পুনরাবৃত্তি করেন (উদাঃ একটি for...ofলুপ দিয়ে) তখন আপনি ইউনিকোড কোড পয়েন্ট পাবেন, ইউটিএফ -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নীচে একটি তীব্র উচ্চারণ সহ মূলধন A থাকে , তার পরে যুক্তরাজ্যের পতাকা এবং পরে একটি কালো মহিলা থাকে woman)

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

যদি আমরা এগুলির প্রতিটিকে আমাদের চূড়ান্ত অ্যারেতে একটি আইটেম হিসাবে রাখতে চাই, তবে আমাদের কোড পয়েন্ট নয়, গ্রাফিমের একটি অ্যারে দরকার ।

গ্রাফিমগুলিতে বিভক্ত

জাভাস্ক্রিপ্ট এর জন্য কোনও অন্তর্নির্মিত সমর্থন নেই - কমপক্ষে এখনও নয়। সুতরাং আমাদের এমন একটি লাইব্রেরি দরকার যা ইউনিকোড বিধিগুলি বোঝে এবং প্রয়োগ করে কোড পয়েন্টগুলির সংমিশ্রণের জন্য গ্রাফিম গঠন করে। ভাগ্যক্রমে, একটি বিদ্যমান: অর্লিংয়ের গ্রাফিম-স্প্লিটার । আপনি এটি এনপিএম দিয়ে ইনস্টল করতে চাইবেন বা, আপনি যদি এনপিএম ব্যবহার না করে থাকেন তবে index.js ফাইলটি ডাউনলোড করে একটি <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>

এবং আমরা সেখানে রয়েছি - তিনটি গ্রাফিমের অ্যারে, যা সম্ভবত আপনি চেয়েছিলেন।


2

আপনি স্ট্রিংয়ের দৈর্ঘ্যের উপর পুনরাবৃত্তি করতে পারেন এবং প্রতিটি অবস্থানে অক্ষরকে চাপ দিতে পারেন :

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


1
যদিও এই পদ্ধতির ঘোষণাপত্রের তুলনায় কিছুটা অপরিহার্য তবে এটি এই থ্রেডের যে কোনওটির মধ্যে সবচেয়ে অভিনয় এবং আরও বেশি ভালবাসার দাবি রাখে। এক সীমাবদ্ধতা থেকে অবস্থান দ্বারা একটি স্ট্রিং উপর একটি অক্ষর পুনরুদ্ধারের যখন গত অক্ষর সঙ্গে তার আচরণ হয় বেসিক বহুভাষিক পরিকল্পনা যেমন, ইমোজির যেমন ইউনিকোড হবে। "😃".charAt(0)একটি
অব্যর্থ

2
@ কাইলমিট এটি একটি সংক্ষিপ্ত ইনপুটটির জন্যই সত্য বলে মনে হচ্ছে। লম্বা ইনপুট ব্যবহার করা .split("")আবার দ্রুততম বিকল্পটিকে তৈরি করে
লাক্স

1
এছাড়াও .split("")প্রচন্ডভাবে ফায়ারফক্সে অপ্টিমাইজ করা বলে মনে হয়। ক্রোমের সাথে লুপটির অনুরূপ কর্মক্ষমতা রয়েছে এবং ফায়ারফক্স বিভাজন ছোট এবং বড় ইনপুটগুলির জন্য ফায়ার ফক্সে উল্লেখযোগ্যভাবে দ্রুত faster
লাক্স

1

সহজ উত্তর:

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

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


-1; এটি হাকাতশীর উত্তরে ইতিমধ্যে অন্তর্ভুক্ত ছিল না এমন কিছু যুক্ত করে ।
মার্ক আমেরি

0

একটি সম্ভাবনা পরেরটি:

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(''));


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.