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


434

জাভাস্ক্রিপ্ট জায়গা (বা ইন-জায়গা) একটি স্ট্রিং কিভাবে বিপরীত না হলে (ব্যবহার বিল্ট ইন ফাংশন ছাড়া, একটি ফিরতি বিবৃতি দিয়ে একটি ফাংশন প্রেরণ করা .reverse(), .charAt()ইত্যাদি)?


সুতরাং, স্ট্রিংয়ের অক্ষরগুলি পেতে আপনাকে .CharAt () ব্যবহার করার অনুমতি নেই?
ইরভিন

155
আপনি পারবেন না। জাভাস্ক্রিপ্ট স্ট্রিংগুলি অপরিবর্তনীয়, যার অর্থ প্রত্যেকটির জন্য বরাদ্দ হওয়া মেমরিটি লেখা যায় না, "জায়গায়" সত্যকে বিপরীত করা অসম্ভব করে তোলে।
ক্রিসেন্ট ফ্রেশ

2
লিখেছেন: crescentfresh এর মন্তব্য দেখুন stackoverflow.com/questions/51185/...
baudtack

1
@ ক্রিসেন্টফ্রেশকে আপনার নতুন উত্তর হিসাবে পোস্ট করা উচিত।
বাডটাক

উত্তর:


736

যতক্ষণ আপনি সাধারণ ASCII অক্ষরগুলি নিয়ে কাজ করছেন এবং আপনি অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করে খুশি হন, এটি কাজ করবে:

function reverse(s){
    return s.split("").reverse().join("");
}

আপনার যদি এমন কোনও সমাধানের প্রয়োজন হয় যা ইউটিএফ -16 বা অন্যান্য বহু-বাইট অক্ষরকে সমর্থন করে, তবে সচেতন হন যে এই ফাংশনটি মজাদার দেখাচ্ছে এমন অবৈধ ইউনিকোড স্ট্রিং বা বৈধ স্ট্রিংগুলি দেবে। পরিবর্তে আপনি এই উত্তরটি বিবেচনা করতে চাইতে পারেন ।

[... গুলি] ইউনিকোড সচেতন, একটি ছোট সম্পাদনা দেয়: -

function reverse(s){
    return [...s].reverse().join("");
}

44
এটি ইউটিএফ -১ str স্ট্রিংয়ের জন্য ভাঙা রয়েছে যার মধ্যে সারোগেট জোড় রয়েছে, যেমন মৌলিক বহুভাষিক বিমানের বাইরে অক্ষর। এটি মিশ্রিত অক্ষরযুক্ত স্ট্রিংগুলির জন্য মজাদার ফলাফলও দেবে, উদাহরণস্বরূপ নীচের অক্ষরটিতে ডায়রিসিস উপস্থিত হতে পারে। প্রথম ইস্যুটি অবৈধ ইউনিকোড স্ট্রিংগুলিতে নেতৃত্ব দেবে, দ্বিতীয়টি বৈধ স্ট্রিংগুলিকে মজাদার দেখায়।
মার্টিন প্রবস্ট

2
@ রিচিভ বেবেডর "সমস্ত অন্তর্নির্মিত ফাংশন ব্যবহার না করে?। রিভার্স ()" এটি কোনও গ্রহণযোগ্য সমাধান হতে পারে না কারণ এটি জেএসে কোনও স্ট্রিংকে উল্টানোর জন্য কার্যকর সমাধান হওয়া সত্ত্বেও প্রশ্নের সীমাবদ্ধতার মধ্যে এটি খাপ খায় না।
ডেভিড স্টারকি

1
@ ডেভিড স্টারকি: হ্যাঁ, প্রায় চার বছর পরে এটার দিকে ফিরে তাকানোর পরে, আমি কীভাবে প্রশ্নের পয়েন্টটি পুরোপুরিভাবে মিস করেছি তা দেখা মুশকিল। দেখে মনে হচ্ছে আমার দুটি মিনিট অপেক্ষা করা উচিত ছিল এবং মূল পোস্টে ক্রিসেন্টফ্রেশের মন্তব্য উপস্থাপন করা উচিত!
belacqua

14
আমার উত্তর @MartinProbst সমস্যার একটি ইউনিকোড-সচেতন সমাধান প্রদান করে ভাড়াটে জোড়া এবং মিশ্রন চিহ্ন সঠিকভাবে সাথে চুক্তি: stackoverflow.com/a/16776380/96656
ম্যাথিয়াস Bynens

1
ইউটিএফ -16 এর জন্য return [...s].reverse().join("");কাজ করতে পারে।
user4642212

410

নিম্নলিখিত কৌশলটি (বা অনুরূপ) সাধারণত জাভাস্ক্রিপ্টে স্ট্রিংটিকে বিপরীতে ব্যবহার করতে ব্যবহৃত হয়:

// Don’t use this!
var naiveReverse = function(string) {
    return string.split('').reverse().join('');
}

আসলে, এখনও পর্যন্ত পোস্ট করা সমস্ত উত্তর এই প্যাটার্নের একটি বৈচিত্র। তবে এই সমাধানে কিছু সমস্যা রয়েছে। উদাহরণ স্বরূপ:

naiveReverse('foo 𝌆 bar');
// → 'rab �� oof'
// Where did the `𝌆` symbol go? Whoops!

আপনি যদি ভাবছেন যে কেন এটি ঘটে থাকে তবে জাভাস্ক্রিপ্টের অভ্যন্তরীণ অক্ষর এনকোডিংটি পড়ুন । (টিএল; ডিআর: 𝌆একটি জ্যোতিষী প্রতীক, এবং জাভাস্ক্রিপ্ট এটিকে দুটি পৃথক কোড ইউনিট হিসাবে প্রকাশ করেছে))

তবে আরও রয়েছে:

// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana mañana');
// → 'anãnam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.

স্ট্রিং বিপরীত বাস্তবায়ন পরীক্ষা করার জন্য একটি ভাল স্ট্রিং নিম্নলিখিত :

'foo 𝌆 bar mañana mañana'

কেন? কারণ এটিতে একটি জ্যোতিষী প্রতীক রয়েছে ( 𝌆) (যা জাভাস্ক্রিপ্টে সারোগেট জোড় দ্বারা উপস্থাপিত ) এবং একটি সংমিশ্রণ চিহ্ন রয়েছে (mañana জোড় শেষটি আসলে দুটি প্রতীক নিয়ে থাকে: U + 006E ল্যাটিন স্মার্ট লেটার এন এবং ইউ + 0303 কম্বিং টিলডি)।

যে ক্রমে সারোগেট জুটি প্রদর্শিত হবে তা বিপরীত করা যাবে না, অন্যথায় জ্যোতির্বিজ্ঞানের চিহ্নটি 'বিপরীত' স্ট্রিংটিতে আর প্রদর্শিত হবে না। এজন্য আপনি সেগুলি দেখেছেন�� পূর্ববর্তী উদাহরণের জন্য আউটপুটে চিহ্নগুলি ।

সম্মিলিত চিহ্নগুলি সর্বদা পূর্ববর্তী প্রতীকটিতে প্রয়োগ করা হয়, সুতরাং আপনাকে সামগ্রিক সংমিশ্রণ চিহ্ন হিসাবে (ইউ + 006E ল্যাটিন স্মার্ট লেটার এন) উভয়ই বিবেচনা করতে হবে U তাদের ক্রমটি বিপরীত করা সংমিশ্রণ চিহ্নটিকে স্ট্রিংয়ের অন্য একটি চিহ্নের সাথে জোড় করে দেবে। উদাহরণস্বরূপ পরিবর্তে উদাহরণ আউটপুট ছিল যে কেনñ

আশা করি, এ পর্যন্ত পোস্ট করা সমস্ত উত্তর কেন ভুল তা ব্যাখ্যা করে


আপনার প্রাথমিক প্রশ্নের উত্তর দেওয়ার জন্য - কীভাবে [সঠিকভাবে] জাভাস্ক্রিপ্টে একটি স্ট্রিং বিপরীত করবেন -, আমি একটি ছোট জাভাস্ক্রিপ্ট লাইব্রেরি লিখেছি যা ইউনিকোড-সচেতন স্ট্রিং বিপরীত করতে সক্ষম। এটিতে আমি সবেমাত্র উল্লেখ করেছি এমন কোনও সমস্যা নেই doesn't গ্রন্থাগারকে Esrever বলা হয় ; এর কোডটি গিটহাবে রয়েছে এবং এটি কোনও জাভাস্ক্রিপ্ট পরিবেশে বেশ কার্যকর। এটি শেলের ইউটিলিটি / বাইনারি সহ আসে, তাই আপনি চাইলে সহজেই আপনার টার্মিনাল থেকে স্ট্রিংগুলি বিপরীত করতে পারেন।

var input = 'foo 𝌆 bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab 𝌆 oof'

"স্থান" অংশ হিসাবে, অন্যান্য উত্তর দেখুন।


65
আপনার উত্তরে আপনার এসেরের কোডের মূল অংশটি অন্তর্ভুক্ত করা উচিত।
r0estir0bbe

1
@ মেগলিও সেই নির্দিষ্ট পদ্ধতির সাথে হ্যাঁ।
ম্যাথিয়াস বাইনেস

8
অবশ্যই, সমস্যাটি হ'ল "রিভার্সিং স্ট্রিং" দ্ব্যর্থহীন মনে হলেও এটি এখানে বর্ণিত সমস্যার মুখোমুখি নয়। একটি স্ট্রিংয়ের বিপরীতে কি স্ট্রিংটি ফিরে আসবে যে মুদ্রিত হলে স্ট্রিংয়ের গ্রাফি ক্লাস্টারগুলি বিপরীত ক্রমে প্রদর্শিত হবে? একদিকে, সম্ভবত এটি শোনাচ্ছে। অন্যদিকে, আপনি কেন এটি করতে চান? এই সংজ্ঞাটি মুদ্রিত হওয়ার উপর নির্ভর করে এবং বিপরীত স্ট্রিং প্রিন্ট করা খুব কমই কার্যকর। অ্যালগরিদমের অংশ হিসাবে, আপনার প্রয়োজনীয়তা সম্পূর্ণ আলাদা হতে পারে।
মার্টিজন

19
এই সাইটে আপনি করে মহান সমস্যা ব্যাখ্যা কাজ, প্রকৃত উত্তর হল আরেকটি দুর্গ মধ্যে । হিসাবে @ r0estir0bbe একটি বছর আগে বললেন, প্রাসঙ্গিক কোড হতে হবে মধ্যে উত্তর, শুধু লিঙ্ক করা।
টিজে ক্রাউডার

4
"আশা করি, এ পর্যন্ত পোস্ট করা সমস্ত উত্তর কেন ভুল তা ব্যাখ্যা করেছে" - এই দাবিটি অত্যধিক জোরালো ইমো। অনেকগুলি ব্যবহারের ক্ষেত্রে ইউটিএফ -16 সমর্থন প্রয়োজন হয় না (সাধারণ উদাহরণ; ইউআরএল এবং ইউআরএল উপাদানগুলি / পরামিতিগুলির সাথে কাজ করা)। সমাধানটি "ভুল" নয় কারণ এটি কোনও অ-প্রয়োজনীয় পরিস্থিতি পরিচালনা করে না। উল্লেখযোগ্যভাবে, শীর্ষ-ভোট প্রাপ্ত জবাব স্পষ্টভাবে ঘোষণা করে যে এটি কেবল ASCII অক্ষরের সাথে কাজ করে এবং এটি অবশ্যই কিছুটা ভুলও নয়।
aroth

92
String.prototype.reverse_string=function() {return this.split("").reverse().join("");}

অথবা

String.prototype.reverse_string = function() {
    var s = "";
    var i = this.length;
    while (i>0) {
        s += this.substring(i-1,i);
        i--;
    }
    return s;
}

আমি অবশ্যই স্ট্রিং প্রোটোটাইপের সাথে সম্মত।
জেফ মিটবল ইয়াং

3
স্ট্রিং সংমিশ্রণ ব্যয়বহুল। একটি অ্যারে তৈরি করা এবং এটিতে যোগদান বা কনক্যাট () ব্যবহার করা ভাল।
বিজোর

2
# 1 সেরা, # 2 মারাত্মকভাবে ধীর হতে পারে
অ্যাডামজেভ লাইভ

9
যাইহোক, ইউনিকোড যৌগিক অক্ষর উপস্থিত থাকলে উভয়ই সমাধানের কাজ করে না।
এরিক গ্রেঞ্জ

2
@ জুয়ানমেন্ডেস আমি ২০০৯ সালে এই মন্তব্যটি রেখেছিলাম, গত 4 বছরে জিনিসগুলি পরিবর্তিত হয়েছে। : পি
বিজোর

63

স্ট্রিং এবং তাদের কর্মক্ষমতা বিশদের বিপরীতে বিশ্লেষণ এবং দশটি ভিন্ন উপায়।

http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/

এই বাস্তবায়নের পারফরম্যান্স:

প্রতি ব্রাউজারে সেরা পারফরম্যান্স বাস্তবায়ন (গুলি)

  • ক্রোম 15 - পদক্ষেপ 1 এবং 6
  • ফায়ারফক্স 7 - বাস্তবায়ন 6
  • আইই 9 - বাস্তবায়ন 4
  • অপেরা 12 - বাস্তবায়ন 9

এই বাস্তবায়নগুলি এখানে:

বাস্তবায়ন 1:

function reverse(s) {
  var o = '';
  for (var i = s.length - 1; i >= 0; i--)
    o += s[i];
  return o;
}

বাস্তবায়ন 2:

function reverse(s) {
  var o = [];
  for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
    o[j] = s[i];
  return o.join('');
}

বাস্তবায়ন 3:

function reverse(s) {
  var o = [];
  for (var i = 0, len = s.length; i <= len; i++)
    o.push(s.charAt(len - i));
  return o.join('');
}

বাস্তবায়ন 4:

function reverse(s) {
  return s.split('').reverse().join('');
}

বাস্তবায়ন 5:

function reverse(s) {
  var i = s.length,
      o = '';
  while (i > 0) {
    o += s.substring(i - 1, i);
    i--;
  }
  return o;
}

বাস্তবায়ন 6:

function reverse(s) {
  for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
  return o;
}

বাস্তবায়ন 7:

function reverse(s) {
  return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}

বাস্তবায়ন 8:

function reverse(s) {
  function rev(s, len, o) {
    return (len === 0) ? o : rev(s, --len, (o += s[len]));
  };
  return rev(s, s.length, '');
}

বাস্তবায়ন 9:

function reverse(s) {
  s = s.split('');
  var len = s.length,
      halfIndex = Math.floor(len / 2) - 1,
      tmp;


     for (var i = 0; i <= halfIndex; i++) {
        tmp = s[len - i - 1];
        s[len - i - 1] = s[i];
        s[i] = tmp;
      }
      return s.join('');
    }

বাস্তবায়ন 10

function reverse(s) {
  if (s.length < 2)
    return s;
  var halfIndex = Math.ceil(s.length / 2);
  return reverse(s.substr(halfIndex)) +
         reverse(s.substr(0, halfIndex));
}

53

পুরো "রিভার্স স্ট্রিং ইন স্ট্রিং" হ'ল একটি পুরানো সাক্ষাত্কার প্রশ্ন সি প্রোগ্রামার, এবং যে লোকেরা তাদের দ্বারা সাক্ষাত্কার নিয়েছিল (প্রতিশোধ নেওয়ার জন্য, সম্ভবত?), জিজ্ঞাসা করবে। দুর্ভাগ্যক্রমে, এটি "ইন প্লেস" অংশটি আর কাজ করে না কারণ কোনও পরিচালিত ভাষার (জেএস, সি # ইত্যাদি) স্ট্রিংগুলি অবিচ্ছেদ্য স্ট্রিং ব্যবহার করে, সুতরাং কোনও নতুন মেমরি বরাদ্দ না করে স্ট্রিং সরানোর পুরো ধারণাটিকে পরাস্ত করে।

যদিও উপরের সমাধানগুলি প্রকৃতপক্ষে একটি স্ট্রিংকে বিপরীত করে, আরও মেমরি বরাদ্দ না করে তারা তা করে না এবং এইভাবে শর্তগুলি পূরণ করে না। বরাদ্দ হিসাবে আপনার স্ট্রিংয়ের সরাসরি অ্যাক্সেস থাকা দরকার এবং এটির জায়গায় এটির বিপরীত করতে সক্ষম হওয়ার জন্য এটির আসল মেমরির অবস্থানটি ম্যানিপুলেট করতে সক্ষম হতে হবে।

ব্যক্তিগতভাবে, আমি সত্যিই এই ধরণের সাক্ষাত্কারের প্রশ্নগুলিকে ঘৃণা করি, তবে দুঃখের বিষয়, আমি নিশ্চিত যে আমরা সেগুলি আগামী কয়েক বছর ধরে দেখব।


7
আমি কমপক্ষে বলতে পারি যে আমার একজন সাক্ষাত্কার গ্রহণকারী কিছুক্ষণ আগে জেএস-এর "ইন-প্লেস" স্ট্রিংটি কীভাবে বিপরীত করতে হবে আমাকে জিজ্ঞাসা করেছিলেন এবং আমি ব্যাখ্যা করেছিলাম যে জেএস-এর স্ট্রিং অপরিবর্তনীয় হওয়ায় এটি কেন অসম্ভব। আমি জানি না যে সে তার উত্তরটি প্রত্যাশা করেছিল কিনা বা আমি তাকে কিছুটা শিক্ষিত করেছিলাম কিনা। যেভাবেই এটি
ঠিকঠাক হয়ে গেছে

1
সম্ভবত তিনি কোনও আবর্জনা সংগ্রহকারী দ্বারা "পরিচালিত" অর্থ, অন্তত এটিই "পরিচালিত ভাষা" বা ভার্চুয়াল মেশিন / ভার্চুয়াল রানটাইম পরিবেশের উপস্থিতি বলতে বোঝায়? @ টোরাজাবুরো
অ্যান্টনবি

39

প্রথমে Array.from()একটি স্ট্রিংকে অ্যারেতে পরিণত করতে, তারপরে Array.prototype.reverse()অ্যারেটিকে বিপরীত করতে এবং তারপরে Array.prototype.join()আবার একটি স্ট্রিং তৈরি করতে ব্যবহার করুন।

const reverse = str => Array.from(str).reverse().join('');

এটি ওভারহেড পেয়েছে, তবে এটি একটি মার্জিত সমাধান! পূর্ব-বিদ্যমান reverseযুক্তিটির পুনর্লিখন নেই ।
গেরশোম

2
@ ফেলিক্সফাবেকার না, string.split('')কাজ করে না। আরও ব্যাখ্যা জন্য এই উত্তর দেখুন ।
মিশা পেরেকোভস্কি

5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি ইউনিকোডের সাথেও কাজ করে। উদাহরণস্বরূপ, উপরের উদাহরণ থেকে:Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
জুলিয়ান টিএফ

3
@ জুলিয়ানটিএফ ঠিক নয়, একটি টিল্ড এখনও 'এন' এর পরিবর্তে 'এ' প্রয়োগ করা হয়।
রোমান বোইকো

2
@ রোমানবাইকো সত্য, তবে আপনি প্রথমে স্ট্রিংটিকে স্বাভাবিক করতে পারেন। Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')হয়ে যাবে"anañam anañam rab 𝌆 oof"
মিস্টার লিস্টার

26

ইসমাস্ক্রিপ্ট In-তে, আপনি স্প্রেড অপারেটরের মতো .split('')স্প্লিট পদ্ধতি ব্যবহার না করেই আরও দ্রুত একটি স্ট্রিংকে বিপরীত করতে পারেন :

var str = [...'racecar'].reverse().join('');

1
ES6 আপনাকে এর পরিবর্তে দুটি ব্যাকটিক `use ব্যবহার করতে দেয়('')

এই ক্ষেত্রে দুটি ব্যাকটিক ব্যবহার করার কোনও কারণ নেই
ভিক

1
আপনি কোড গল্ফিং না থাকলে আপনার এড়ানো উচিত। লেখার string.split('')চেয়ে বেশিরভাগ মানুষের কাছে পরিষ্কার হয় [...string]
আনানফায়

1
@ অ্যানানফয়ের .split('')পরিপূরক বিমানগুলি (ইউটিএফ -16 এ সারোগেট জোড় ) এর অক্ষরগুলির সাথে ইস্যু রয়েছে, কারণ এটি কোড পয়েন্টের পরিবর্তে ইউটিএফ -16 কোড ইউনিট দ্বারা বিভক্ত হয় । স্প্রেড অপারেটর এবং (আমার পছন্দ) না। Array.from()
ইনক্লিং

@ ইনক্লিং আমি বুঝতে পারি নি যে এটি একটি সমস্যা। এটা ইশারা জন্য ধন্যবাদ। আমি স্বচ্ছতার জন্য একটি ইউটিলিটি ফাংশন লিখতে প্রলুব্ধ হব।
আনানফায়

19

মনে হচ্ছে পার্টিতে আমি 3 বছর দেরি করেছি ...

দুর্ভাগ্যক্রমে আপনি হিসাবে চিহ্নিত করা যেতে পারে না। দেখুন যারা জাভাস্ক্রিপ্ট স্ট্রিং অপরিবর্তনীয়? আমার কি জাভাস্ক্রিপ্টে "স্ট্রিং বিল্ডার" দরকার?

পরবর্তী সেরা কাজটি আপনি করতে পারেন একটি "ভিউ" বা "র‍্যাপার" তৈরি করা, যা একটি স্ট্রিং নেয় এবং স্ট্রিং এপিআইয়ের যে কোনও অংশ আপনি ব্যবহার করছেন তা পুনরায় সরবরাহ করে তবে স্ট্রিংয়ের ভান করা উল্টা হয়। উদাহরণ স্বরূপ:

var identity = function(x){return x};

function LazyString(s) {
    this.original = s;

    this.length = s.length;
    this.start = 0; this.stop = this.length; this.dir = 1; // "virtual" slicing
    // (dir=-1 if reversed)

    this._caseTransform = identity;
}

// syntactic sugar to create new object:
function S(s) {
    return new LazyString(s);
}

//We now implement a `"...".reversed` which toggles a flag which will change our math:

(function(){ // begin anonymous scope
    var x = LazyString.prototype;

    // Addition to the String API
    x.reversed = function() {
        var s = new LazyString(this.original);

        s.start = this.stop - this.dir;
        s.stop = this.start - this.dir;
        s.dir = -1*this.dir;
        s.length = this.length;

        s._caseTransform = this._caseTransform;
        return s;
    }

//We also override string coercion for some extra versatility (not really necessary):

    // OVERRIDE STRING COERCION
    //   - for string concatenation e.g. "abc"+reversed("abc")
    x.toString = function() {
        if (typeof this._realized == 'undefined') {  // cached, to avoid recalculation
            this._realized = this.dir==1 ?
                this.original.slice(this.start,this.stop) : 
                this.original.slice(this.stop+1,this.start+1).split("").reverse().join("");

            this._realized = this._caseTransform.call(this._realized, this._realized);
        }
        return this._realized;
    }

//Now we reimplement the String API by doing some math:

    // String API:

    // Do some math to figure out which character we really want

    x.charAt = function(i) {
        return this.slice(i, i+1).toString();
    }
    x.charCodeAt = function(i) {
        return this.slice(i, i+1).toString().charCodeAt(0);
    }

// Slicing functions:

    x.slice = function(start,stop) {
        // lazy chaining version of https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice

        if (stop===undefined)
            stop = this.length;

        var relativeStart = start<0 ? this.length+start : start;
        var relativeStop = stop<0 ? this.length+stop : stop;

        if (relativeStart >= this.length)
            relativeStart = this.length;
        if (relativeStart < 0)
            relativeStart = 0;

        if (relativeStop > this.length)
            relativeStop = this.length;
        if (relativeStop < 0)
            relativeStop = 0;

        if (relativeStop < relativeStart)
            relativeStop = relativeStart;

        var s = new LazyString(this.original);
        s.length = relativeStop - relativeStart;
        s.start = this.start + this.dir*relativeStart;
        s.stop = s.start + this.dir*s.length;
        s.dir = this.dir;

        //console.log([this.start,this.stop,this.dir,this.length], [s.start,s.stop,s.dir,s.length])

        s._caseTransform = this._caseTransform;
        return s;
    }
    x.substring = function() {
        // ...
    }
    x.substr = function() {
        // ...
    }

//Miscellaneous functions:

    // Iterative search

    x.indexOf = function(value) {
        for(var i=0; i<this.length; i++)
            if (value==this.charAt(i))
                return i;
        return -1;
    }
    x.lastIndexOf = function() {
        for(var i=this.length-1; i>=0; i--)
            if (value==this.charAt(i))
                return i;
        return -1;
    }

    // The following functions are too complicated to reimplement easily.
    // Instead just realize the slice and do it the usual non-in-place way.

    x.match = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }
    x.replace = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }
    x.search = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }
    x.split = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }

// Case transforms:

    x.toLowerCase = function() {
        var s = new LazyString(this.original);
        s._caseTransform = ''.toLowerCase;

        s.start=this.start; s.stop=this.stop; s.dir=this.dir; s.length=this.length;

        return s;
    }
    x.toUpperCase = function() {
        var s = new LazyString(this.original);
        s._caseTransform = ''.toUpperCase;

        s.start=this.start; s.stop=this.stop; s.dir=this.dir; s.length=this.length;

        return s;
    }

})() // end anonymous scope

ডেমো:

> r = S('abcABC')
LazyString
  original: "abcABC"
  __proto__: LazyString

> r.charAt(1);       // doesn't reverse string!!! (good if very long)
"B"

> r.toLowerCase()    // must reverse string, so does so
"cbacba"

> r.toUpperCase()    // string already reversed: no extra work
"CBACBA"

> r + '-demo-' + r   // natural coercion, string already reversed: no extra work
"CBAcba-demo-CBAcba"

ক্র্যাকার - নিখুঁত গণিত দ্বারা স্থানে সম্পন্ন করা হয়েছে, প্রতিটি চরিত্রটি একবার একবার পরিদর্শন করেছেন, এবং শুধুমাত্র প্রয়োজনে:

> 'demo: ' + S('0123456789abcdef').slice(3).reversed().slice(1,-1).toUpperCase()
"demo: EDCBA987654"

> S('0123456789ABCDEF').slice(3).reversed().slice(1,-1).toLowerCase().charAt(3)
"b"

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

এটি মূল্যবান কিনা (বেশিরভাগ প্রোগ্রামিং ভাষার মতো-অনুলিপি-যেমন-অনুলিপিের চেয়েও বেশি) আপনার ব্যবহারের ক্ষেত্রে এবং আপনি স্ট্রিং এপিআইকে কীভাবে দক্ষতার সাথে পুনরায় প্রতিস্থাপন করেন তার উপর নির্ভর করে। উদাহরণস্বরূপ, যদি আপনি চান সমস্ত স্ট্রিং ইনডেক্স ম্যানিপুলেশন করতে হয়, বা ছোট sliceগুলি বা substrগুলি নেয় তবে এটি আপনার স্থান এবং সময় সাশ্রয় করবে। আপনি যদি বড় বিপরীত টুকরা বা সাবস্ট্রিংগুলি মুদ্রণের পরিকল্পনা করছেন তবে সঞ্চয়টি সত্যই ছোট হতে পারে, সম্পূর্ণ অনুলিপি করার চেয়েও খারাপ। আপনার "বিপরীত" স্ট্রিংয়ের ধরণও থাকবে নাstring , যদিও আপনি প্রোটোটাইপিং দিয়ে এটি জাল করতে সক্ষম হতে পারেন।

উপরের ডেমো প্রয়োগটি রিভার্সডস্ট্রিং টাইপের একটি নতুন অবজেক্ট তৈরি করে। এটি প্রোটোটাইপযুক্ত, এবং তাই প্রায় ন্যূনতম কাজ এবং ন্যূনতম স্পেস ওভারহেড (প্রোটোটাইপ সংজ্ঞাগুলি ভাগ করা হয়) দিয়ে মোটামুটি দক্ষ। এটি পিছনে কাটা জড়িত একটি অলস বাস্তবায়ন। আপনি যখনই .sliceবা এর মতো কোনও কার্য সম্পাদন করেন .reversedএটি সূচক গণিত সম্পাদন করবে। অবশেষে যখন আপনি ডেটা উত্তোলন করবেন (স্পষ্টভাবে কলিং .toString()বা .charCodeAt(...)কোনও কিছু দিয়ে), এটি "স্মার্ট" পদ্ধতিতে প্রয়োগ করা হবে, সম্ভাব্যতম ডেটা স্পর্শ করা।

দ্রষ্টব্য: উপরের স্ট্রিং এপিআই একটি উদাহরণ এবং পুরোপুরি প্রয়োগ করা যেতে পারে না। আপনি প্রয়োজন মাত্র 1-2 ফাংশন ব্যবহার করতে পারেন।


13

জাভাস্ক্রিপ্টে আপনি স্ট্রিংটি বিপরীত করতে পারেন এমন অনেকগুলি উপায় রয়েছে। আমি তিনটি উপায়ে পছন্দ করছি prefer

পদ্ধতির 1: বিপরীত ফাংশন ব্যবহার করে:

function reverse(str) {
  return str.split('').reverse().join('');
}

পদ্ধতির 2: অক্ষরের মাধ্যমে লুপিং:

function reverse(str) {
  let reversed = '';

  for (let character of str) {
    reversed = character + reversed;
  }

  return reversed;
}

পদ্ধতি 3: হ্রাস ফাংশন ব্যবহার করে:

function reverse(str) {
  return str.split('').reduce((rev, char) => char + rev, '');
}

আশা করি এটা কাজে লাগবে :)


10

একটি সাক্ষাত্কারের সময়, আমাকে কোনও ভেরিয়েবল বা নেটিভ পদ্ধতি ব্যবহার না করে একটি স্ট্রিং উল্টাতে বলা হয়েছিল was এটি আমার প্রিয় বাস্তবায়ন:

function reverseString(str) {
    return str === '' ? '' : reverseString(str.slice(1)) + str[0];
}

সংক্ষিপ্ত, সহজ, তবে নরকের মতো ধীর;)
টম

13
জিরো দেশীয় পদ্ধতি? কি হবে slice? : - /
পাতা

1
পুনরাবৃত্তি আকর্ষণীয় ব্যবহার। প্রচলিত যে এটি স্ট্যাক ওভারফ্লোতে রয়েছে। স্ট্যাকওভারফ্লো.com
অ্যালেক্স

@ অ্যালেক্স, আপনি একটি ভাল পয়েন্ট করেছেন। কিছু ক্ষেত্রে, সাক্ষাত্কার আপনাকে ব্যবহার না করার জন্য জিজ্ঞাসা করবে Array.prototype.reverse()
ড্যানিয়েল

10

এটি করার একাধিক উপায় রয়েছে, আপনি নিম্নলিখিতগুলি পরীক্ষা করতে পারেন,

1. লুপের জন্য প্রচলিত (বাড়ানো):

function reverseString(str){
        let stringRev ="";
        for(let i= 0; i<str.length; i++){
            stringRev = str[i]+stringRev;
        }
        return stringRev;
}
alert(reverseString("Hello World!"));

লুপের জন্য ditionতিহ্যগত (হ্রাস):

function reverseString(str){
    let revstr = "";
    for(let i = str.length-1; i>=0; i--){
        revstr = revstr+ str[i];
    }
    return revstr;
}
alert(reverseString("Hello World!"));

৩. অফ-লুপ ব্যবহার করা

function reverseString(str){
    let strn ="";
    for(let char of str){
        strn = char + strn;
    }
    return strn;
}
alert(reverseString("Get well soon"));

4. forEach / হাই অর্ডার অ্যারে পদ্ধতি ব্যবহার করে:

function reverseString(str){

  let revSrring = "";
  str.split("").forEach(function(char){
    
    revSrring = char + revSrring;
  
  });
  return revSrring;
}
alert(reverseString("Learning JavaScript"));

5. ES6 মান:

function reverseString(str){

  let revSrring = "";
  str.split("").forEach(char => revSrring = char + revSrring);
  return revSrring;
}
alert(reverseString("Learning JavaScript"));

The. সর্বশেষতম উপায়:

function reverseString(str){

  return str.split("").reduce(function(revString, char){
       return char + revString;
  }, "");
 
}

alert(reverseString("Learning JavaScript"));

You. আপনি নিম্নলিখিতটি ব্যবহার করে ফলাফলও পেতে পারেন,

function reverseString(str){

  return str.split("").reduce((revString, char)=> char + revString, "");
 
}
alert(reverseString("Learning JavaScript"));



6

এটি আমার মনে হয় সবচেয়ে সহজ উপায়

var reverse = function(str) {
    var arr = [];
    
    for (var i = 0, len = str.length; i <= len; i++) {
        arr.push(str.charAt(len - i))
    }

    return arr.join('');
}

console.log(reverse('I want a 🍺'));


3
আপনি আপনার উদাহরণে একটি ইমোজি অন্তর্ভুক্ত করেছেন এটি দুর্দান্ত। যাতে আমরা দ্রুত দেখতে পাই যে এটি স্পষ্টভাবে ইমোজি এবং অন্যান্য অনেক ইউনিকোড অক্ষরের জন্য কাজ করে না।
orহোর এম

বিশ্বাস, যদিও আপনার উত্তরটি সঠিক, আমি এটিকে সহজতম উপায় বলে সম্মত নই। প্রথম বেশ কয়েকটি উত্তর Array.prototype.reverse()সেটিকে সবচেয়ে সহজ উপায় হিসাবে ব্যবহার করে, তাই সবচেয়ে জনপ্রিয় উত্তর। অবশ্যই এটির জন্য জাভাস্ক্রিপ্টের ভাল পূর্বের জ্ঞান প্রয়োজন।
ড্যানিয়েল

6
var str = 'sample string';
[].map.call(str, function(x) {
  return x;
}).reverse().join('');

অথবা

var str = 'sample string';
console.log(str.split('').reverse().join(''));

// আউটপুট: 'gnર્ટ এলপমাস'


আপনার পুরো 'মানচিত্র` অংশটি লিখতে পারেন [...str]

5

আমি জানি যে এটি একটি পুরানো প্রশ্ন যা এর উত্তরের জবাব দেওয়া হয়েছে, তবে নিজের মনোরঞ্জনের জন্য আমি নিম্নলিখিত বিপরীত ফাংশনটি লিখেছিলাম এবং ভেবেছিলাম এটি অন্য কারও পক্ষে কার্যকর হলে আমি এটি ভাগ করে নেব। এটি সারোগেট জোড়া এবং সমন্বয় চিহ্ন উভয়ই পরিচালনা করে:

function StringReverse (str)
{
  var charArray = [];
  for (var i = 0; i < str.length; i++)
    {
      if (i+1 < str.length)
        {
          var value = str.charCodeAt(i);
          var nextValue = str.charCodeAt(i+1);
          if (   (   value >= 0xD800 && value <= 0xDBFF
                  && (nextValue & 0xFC00) == 0xDC00) // Surrogate pair)
              || (nextValue >= 0x0300 && nextValue <= 0x036F)) // Combining marks
            {
              charArray.unshift(str.substring(i, i+2));
              i++; // Skip the other half
              continue;
            }
        }

      // Otherwise we just have a rogue surrogate marker or a plain old character.
      charArray.unshift(str[i]);
    }

  return charArray.join('');
}

ম্যাথিয়াস, পুনাইকোড এবং জাভাস্ক্রিপ্টে চরিত্রের এনকোডিংয়ের জটিলতা সম্পর্কে আমাকে স্কুল করার জন্য অন্যান্য প্রসঙ্গগুলি।


4

আপনি পারবেন না কারণ জেএস স্ট্রিংগুলি পরিবর্তনযোগ্য। সংক্ষিপ্ত স্থানে অ-সমাধান

[...str].reverse().join``


3

আপনি যদি কোনও বিল্ট ইন ফাংশন ব্যবহার করতে না চান। এটা চেষ্টা কর

var string = 'abcdefg';
var newstring = '';

for(let i = 0; i < string.length; i++){
    newstring = string[i] += newstring;
}

console.log(newstring);

2

আসল উত্তরটি: আপনি এটি জায়গায় বিপরীত করতে পারবেন না, তবে আপনি একটি নতুন স্ট্রিং তৈরি করতে পারেন যা বিপরীত।

যেমন পুনরাবৃত্তি নিয়ে খেলতে অনুশীলন করা: কখনও কখনও আপনি যখন কোনও সাক্ষাত্কারে যান, তখন সাক্ষাত্কার আপনাকে জিজ্ঞাসা করতে পারে কীভাবে পুনরাবৃত্তি ব্যবহার করে এটি করা যায় এবং আমি মনে করি "পছন্দসই উত্তর" হতে পারে "আমি বরং এটি পুনরাবৃত্তি হিসাবে এটি করব না সহজেই স্ট্যাকের ওভারফ্লো হতে পারে "(কারণ এটি O(n)বরং এটি is O(log n)যদি এটি হয় O(log n)তবে স্ট্যাকের ওভারফ্লো পাওয়া বেশ কঠিন - 4 বিলিয়ন আইটেম 32 এর স্ট্যাক স্তর দ্বারা পরিচালনা করা যেতে পারে, যেমন 2 ** 32 4294967296। তবে যদি হয়O(n) তবে এটি সহজেই একটি স্ট্যাকের ওভারফ্লো পেতে পারে।

কখনও কখনও সাক্ষাত্কারকারী আপনাকে জিজ্ঞাসা করবে, "ঠিক যেমন একটি অনুশীলন হিসাবে, আপনি এখনও এটি পুনরাবৃত্তি ব্যবহার করে লিখেন না?" এবং এটি এখানে:

String.prototype.reverse = function() {
    if (this.length <= 1) return this;
    else return this.slice(1).reverse() + this.slice(0,1);
}

পরীক্ষা রান:

var s = "";
for(var i = 0; i < 1000; i++) {
    s += ("apple" + i);
}
console.log(s.reverse());

আউটপুট:

999elppa899elppa...2elppa1elppa0elppa

একটি স্ট্যাক ওভারফ্লো পেয়ে চেষ্টা করতে, আমি পরিবর্তন 1000করতে 10000Google Chrome- এ, এবং এটি প্রতিবেদন করার সময়:

RangeError: Maximum call stack size exceeded

2

স্ট্রিংগুলি এগুলি অপরিবর্তনীয় তবে আপনি নিম্নলিখিত কোড সহ সহজেই বিপরীত অনুলিপি তৈরি করতে পারেন:

function reverseString(str) {

  var strArray = str.split("");
  strArray.reverse();

  var strReverse = strArray.join("");

  return strReverse;
}

reverseString("hello");

2
//es6
//array.from
const reverseString = (string) => Array.from(string).reduce((a, e) => e + a);
//split
const reverseString = (string) => string.split('').reduce((a, e) => e + a); 

//split problem
"𠜎𠺢".split('')[0] === Array.from("𠜎𠺢")[0] // "�" === "𠜎" => false
"😂😹🤗".split('')[0] === Array.from("😂😹🤗")[0] // "�" === "😂" => false

1
এটির পক্ষে সুবিধা রয়েছে যে এটি পরিপূরক বিমানের অক্ষরগুলি সঠিকভাবে পরিচালনা করে।

2

একটি ছোট ফাংশন যা ডায়াক্রিটিক্স এবং 2-বাইট অক্ষর উভয়কেই সমন্বিত করে:

(function(){
  var isCombiningDiacritic = function( code )
  {
    return (0x0300 <= code && code <= 0x036F)  // Comb. Diacritical Marks
        || (0x1AB0 <= code && code <= 0x1AFF)  // Comb. Diacritical Marks Extended
        || (0x1DC0 <= code && code <= 0x1DFF)  // Comb. Diacritical Marks Supplement
        || (0x20D0 <= code && code <= 0x20FF)  // Comb. Diacritical Marks for Symbols
        || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks

  };

  String.prototype.reverse = function()
  {
    var output = "",
        i      = this.length - 1,
        width;

    for ( ; i >= 0; --i )
    {
      width = 1;
      while( i > 0 && isCombiningDiacritic( this.charCodeAt(i) ) )
      {
        --i;
        width++;
      }

      if (
           i > 0
        && "\uDC00" <= this[i]   && this[i]   <= "\uDFFF"
        && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF"
      )
      {
        --i;
        width++;
      }

      output += this.substr( i, width );
    }

    return output;
  }
})();

// Tests
[
  'abcdefg',
  'ab\u0303c',
  'a\uD83C\uDFA5b',
  'a\uD83C\uDFA5b\uD83C\uDFA6c',
  'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d',
  'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡' // copied from http://stackoverflow.com/a/1732454/1509264
].forEach(
  function(str){ console.log( str + " -> " + str.reverse() ); }
);
  


হালনাগাদ

ডায়াক্রিটিক্সের সম্মিলনের আরও একটি সম্পূর্ণ তালিকা:

      var isCombiningDiacritic = function( code )
      {
        return (0x0300 <= code && code <= 0x036F)
            || (0x0483 <= code && code <= 0x0489)
            || (0x0591 <= code && code <= 0x05BD)
            || (code == 0x05BF)
            || (0x05C1 <= code && code <= 0x05C2)
            || (0x05C4 <= code && code <= 0x05C5)
            || (code == 0x05C7)
            || (0x0610 <= code && code <= 0x061A)
            || (0x064B <= code && code <= 0x065F)
            || (code == 0x0670)
            || (0x06D6 <= code && code <= 0x06DC)
            || (0x06DF <= code && code <= 0x06E4)
            || (0x06E7 <= code && code <= 0x06E8)
            || (0x06EA <= code && code <= 0x06ED)
            || (code == 0x0711)
            || (0x0730 <= code && code <= 0x074A)
            || (0x07A6 <= code && code <= 0x07B0)
            || (0x07EB <= code && code <= 0x07F3)
            || (code == 0x07FD)
            || (0x0816 <= code && code <= 0x0819)
            || (0x081B <= code && code <= 0x0823)
            || (0x0825 <= code && code <= 0x0827)
            || (0x0829 <= code && code <= 0x082D)
            || (0x0859 <= code && code <= 0x085B)
            || (0x08D3 <= code && code <= 0x08E1)
            || (0x08E3 <= code && code <= 0x0902)
            || (code == 0x093A)
            || (code == 0x093C)
            || (0x0941 <= code && code <= 0x0948)
            || (code == 0x094D)
            || (0x0951 <= code && code <= 0x0957)
            || (0x0962 <= code && code <= 0x0963)
            || (code == 0x0981)
            || (code == 0x09BC)
            || (0x09C1 <= code && code <= 0x09C4)
            || (code == 0x09CD)
            || (0x09E2 <= code && code <= 0x09E3)
            || (0x09FE <= code && code <= 0x0A02)
            || (code == 0x0A3C)
            || (0x0A41 <= code && code <= 0x0A51)
            || (0x0A70 <= code && code <= 0x0A71)
            || (code == 0x0A75)
            || (0x0A81 <= code && code <= 0x0A82)
            || (code == 0x0ABC)
            || (0x0AC1 <= code && code <= 0x0AC8)
            || (code == 0x0ACD)
            || (0x0AE2 <= code && code <= 0x0AE3)
            || (0x0AFA <= code && code <= 0x0B01)
            || (code == 0x0B3C)
            || (code == 0x0B3F)
            || (0x0B41 <= code && code <= 0x0B44)
            || (0x0B4D <= code && code <= 0x0B56)
            || (0x0B62 <= code && code <= 0x0B63)
            || (code == 0x0B82)
            || (code == 0x0BC0)
            || (code == 0x0BCD)
            || (code == 0x0C00)
            || (code == 0x0C04)
            || (0x0C3E <= code && code <= 0x0C40)
            || (0x0C46 <= code && code <= 0x0C56)
            || (0x0C62 <= code && code <= 0x0C63)
            || (code == 0x0C81)
            || (code == 0x0CBC)
            || (0x0CCC <= code && code <= 0x0CCD)
            || (0x0CE2 <= code && code <= 0x0CE3)
            || (0x0D00 <= code && code <= 0x0D01)
            || (0x0D3B <= code && code <= 0x0D3C)
            || (0x0D41 <= code && code <= 0x0D44)
            || (code == 0x0D4D)
            || (0x0D62 <= code && code <= 0x0D63)
            || (code == 0x0DCA)
            || (0x0DD2 <= code && code <= 0x0DD6)
            || (code == 0x0E31)
            || (0x0E34 <= code && code <= 0x0E3A)
            || (0x0E47 <= code && code <= 0x0E4E)
            || (code == 0x0EB1)
            || (0x0EB4 <= code && code <= 0x0EBC)
            || (0x0EC8 <= code && code <= 0x0ECD)
            || (0x0F18 <= code && code <= 0x0F19)
            || (code == 0x0F35)
            || (code == 0x0F37)
            || (code == 0x0F39)
            || (0x0F71 <= code && code <= 0x0F7E)
            || (0x0F80 <= code && code <= 0x0F84)
            || (0x0F86 <= code && code <= 0x0F87)
            || (0x0F8D <= code && code <= 0x0FBC)
            || (code == 0x0FC6)
            || (0x102D <= code && code <= 0x1030)
            || (0x1032 <= code && code <= 0x1037)
            || (0x1039 <= code && code <= 0x103A)
            || (0x103D <= code && code <= 0x103E)
            || (0x1058 <= code && code <= 0x1059)
            || (0x105E <= code && code <= 0x1060)
            || (0x1071 <= code && code <= 0x1074)
            || (code == 0x1082)
            || (0x1085 <= code && code <= 0x1086)
            || (code == 0x108D)
            || (code == 0x109D)
            || (0x135D <= code && code <= 0x135F)
            || (0x1712 <= code && code <= 0x1714)
            || (0x1732 <= code && code <= 0x1734)
            || (0x1752 <= code && code <= 0x1753)
            || (0x1772 <= code && code <= 0x1773)
            || (0x17B4 <= code && code <= 0x17B5)
            || (0x17B7 <= code && code <= 0x17BD)
            || (code == 0x17C6)
            || (0x17C9 <= code && code <= 0x17D3)
            || (code == 0x17DD)
            || (0x180B <= code && code <= 0x180D)
            || (0x1885 <= code && code <= 0x1886)
            || (code == 0x18A9)
            || (0x1920 <= code && code <= 0x1922)
            || (0x1927 <= code && code <= 0x1928)
            || (code == 0x1932)
            || (0x1939 <= code && code <= 0x193B)
            || (0x1A17 <= code && code <= 0x1A18)
            || (code == 0x1A1B)
            || (code == 0x1A56)
            || (0x1A58 <= code && code <= 0x1A60)
            || (code == 0x1A62)
            || (0x1A65 <= code && code <= 0x1A6C)
            || (0x1A73 <= code && code <= 0x1A7F)
            || (0x1AB0 <= code && code <= 0x1B03)
            || (code == 0x1B34)
            || (0x1B36 <= code && code <= 0x1B3A)
            || (code == 0x1B3C)
            || (code == 0x1B42)
            || (0x1B6B <= code && code <= 0x1B73)
            || (0x1B80 <= code && code <= 0x1B81)
            || (0x1BA2 <= code && code <= 0x1BA5)
            || (0x1BA8 <= code && code <= 0x1BA9)
            || (0x1BAB <= code && code <= 0x1BAD)
            || (code == 0x1BE6)
            || (0x1BE8 <= code && code <= 0x1BE9)
            || (code == 0x1BED)
            || (0x1BEF <= code && code <= 0x1BF1)
            || (0x1C2C <= code && code <= 0x1C33)
            || (0x1C36 <= code && code <= 0x1C37)
            || (0x1CD0 <= code && code <= 0x1CD2)
            || (0x1CD4 <= code && code <= 0x1CE0)
            || (0x1CE2 <= code && code <= 0x1CE8)
            || (code == 0x1CED)
            || (code == 0x1CF4)
            || (0x1CF8 <= code && code <= 0x1CF9)
            || (0x1DC0 <= code && code <= 0x1DFF)
            || (0x20D0 <= code && code <= 0x20F0)
            || (0x2CEF <= code && code <= 0x2CF1)
            || (code == 0x2D7F)
            || (0x2DE0 <= code && code <= 0x2DFF)
            || (0x302A <= code && code <= 0x302D)
            || (0x3099 <= code && code <= 0x309A)
            || (0xA66F <= code && code <= 0xA672)
            || (0xA674 <= code && code <= 0xA67D)
            || (0xA69E <= code && code <= 0xA69F)
            || (0xA6F0 <= code && code <= 0xA6F1)
            || (code == 0xA802)
            || (code == 0xA806)
            || (code == 0xA80B)
            || (0xA825 <= code && code <= 0xA826)
            || (0xA8C4 <= code && code <= 0xA8C5)
            || (0xA8E0 <= code && code <= 0xA8F1)
            || (code == 0xA8FF)
            || (0xA926 <= code && code <= 0xA92D)
            || (0xA947 <= code && code <= 0xA951)
            || (0xA980 <= code && code <= 0xA982)
            || (code == 0xA9B3)
            || (0xA9B6 <= code && code <= 0xA9B9)
            || (0xA9BC <= code && code <= 0xA9BD)
            || (code == 0xA9E5)
            || (0xAA29 <= code && code <= 0xAA2E)
            || (0xAA31 <= code && code <= 0xAA32)
            || (0xAA35 <= code && code <= 0xAA36)
            || (code == 0xAA43)
            || (code == 0xAA4C)
            || (code == 0xAA7C)
            || (code == 0xAAB0)
            || (0xAAB2 <= code && code <= 0xAAB4)
            || (0xAAB7 <= code && code <= 0xAAB8)
            || (0xAABE <= code && code <= 0xAABF)
            || (code == 0xAAC1)
            || (0xAAEC <= code && code <= 0xAAED)
            || (code == 0xAAF6)
            || (code == 0xABE5)
            || (code == 0xABE8)
            || (code == 0xABED)
            || (code == 0xFB1E)
            || (0xFE00 <= code && code <= 0xFE0F)
            || (0xFE20 <= code && code <= 0xFE2F)
            || (code == 0x101FD)
            || (code == 0x102E0)
            || (0x10376 <= code && code <= 0x1037A)
            || (0x10A01 <= code && code <= 0x10A0F)
            || (0x10A38 <= code && code <= 0x10A3F)
            || (0x10AE5 <= code && code <= 0x10AE6)
            || (0x10D24 <= code && code <= 0x10D27)
            || (0x10F46 <= code && code <= 0x10F50)
            || (code == 0x11001)
            || (0x11038 <= code && code <= 0x11046)
            || (0x1107F <= code && code <= 0x11081)
            || (0x110B3 <= code && code <= 0x110B6)
            || (0x110B9 <= code && code <= 0x110BA)
            || (0x11100 <= code && code <= 0x11102)
            || (0x11127 <= code && code <= 0x1112B)
            || (0x1112D <= code && code <= 0x11134)
            || (code == 0x11173)
            || (0x11180 <= code && code <= 0x11181)
            || (0x111B6 <= code && code <= 0x111BE)
            || (0x111C9 <= code && code <= 0x111CC)
            || (0x1122F <= code && code <= 0x11231)
            || (code == 0x11234)
            || (0x11236 <= code && code <= 0x11237)
            || (code == 0x1123E)
            || (code == 0x112DF)
            || (0x112E3 <= code && code <= 0x112EA)
            || (0x11300 <= code && code <= 0x11301)
            || (0x1133B <= code && code <= 0x1133C)
            || (code == 0x11340)
            || (0x11366 <= code && code <= 0x11374)
            || (0x11438 <= code && code <= 0x1143F)
            || (0x11442 <= code && code <= 0x11444)
            || (code == 0x11446)
            || (code == 0x1145E)
            || (0x114B3 <= code && code <= 0x114B8)
            || (code == 0x114BA)
            || (0x114BF <= code && code <= 0x114C0)
            || (0x114C2 <= code && code <= 0x114C3)
            || (0x115B2 <= code && code <= 0x115B5)
            || (0x115BC <= code && code <= 0x115BD)
            || (0x115BF <= code && code <= 0x115C0)
            || (0x115DC <= code && code <= 0x115DD)
            || (0x11633 <= code && code <= 0x1163A)
            || (code == 0x1163D)
            || (0x1163F <= code && code <= 0x11640)
            || (code == 0x116AB)
            || (code == 0x116AD)
            || (0x116B0 <= code && code <= 0x116B5)
            || (code == 0x116B7)
            || (0x1171D <= code && code <= 0x1171F)
            || (0x11722 <= code && code <= 0x11725)
            || (0x11727 <= code && code <= 0x1172B)
            || (0x1182F <= code && code <= 0x11837)
            || (0x11839 <= code && code <= 0x1183A)
            || (0x119D4 <= code && code <= 0x119DB)
            || (code == 0x119E0)
            || (0x11A01 <= code && code <= 0x11A06)
            || (0x11A09 <= code && code <= 0x11A0A)
            || (0x11A33 <= code && code <= 0x11A38)
            || (0x11A3B <= code && code <= 0x11A3E)
            || (code == 0x11A47)
            || (0x11A51 <= code && code <= 0x11A56)
            || (0x11A59 <= code && code <= 0x11A5B)
            || (0x11A8A <= code && code <= 0x11A96)
            || (0x11A98 <= code && code <= 0x11A99)
            || (0x11C30 <= code && code <= 0x11C3D)
            || (0x11C92 <= code && code <= 0x11CA7)
            || (0x11CAA <= code && code <= 0x11CB0)
            || (0x11CB2 <= code && code <= 0x11CB3)
            || (0x11CB5 <= code && code <= 0x11CB6)
            || (0x11D31 <= code && code <= 0x11D45)
            || (code == 0x11D47)
            || (0x11D90 <= code && code <= 0x11D91)
            || (code == 0x11D95)
            || (code == 0x11D97)
            || (0x11EF3 <= code && code <= 0x11EF4)
            || (0x16AF0 <= code && code <= 0x16AF4)
            || (0x16B30 <= code && code <= 0x16B36)
            || (code == 0x16F4F)
            || (0x16F8F <= code && code <= 0x16F92)
            || (0x1BC9D <= code && code <= 0x1BC9E)
            || (0x1D167 <= code && code <= 0x1D169)
            || (0x1D17B <= code && code <= 0x1D182)
            || (0x1D185 <= code && code <= 0x1D18B)
            || (0x1D1AA <= code && code <= 0x1D1AD)
            || (0x1D242 <= code && code <= 0x1D244)
            || (0x1DA00 <= code && code <= 0x1DA36)
            || (0x1DA3B <= code && code <= 0x1DA6C)
            || (code == 0x1DA75)
            || (code == 0x1DA84)
            || (0x1DA9B <= code && code <= 0x1E02A)
            || (0x1E130 <= code && code <= 0x1E136)
            || (0x1E2EC <= code && code <= 0x1E2EF)
            || (0x1E8D0 <= code && code <= 0x1E8D6)
            || (0x1E944 <= code && code <= 0x1E94A)
            || (0xE0100 <= code && code <= 0xE01EF);
      };

একটি উপযুক্ত চেষ্টা, তবে আপনি যদি ইউনিকোডডেটা.টিএসটিএক্স ফাইলটি স্ক্যান করতে পারেন তবে আপনি দেখতে পাবেন যে 5 এর চেয়ে ডায়াক্রিটিক্সের সংমিশ্রণের ক্ষেত্রে এই জাতীয় পরিসরের 316 টি রয়েছে
মিস্টার লিস্টার

@ মিঃলিস্টার এর পরে সমাধানটি হ'ল isCombiningDiacriticসমস্ত 316 টি রেঞ্জ অন্তর্ভুক্ত করার জন্য ফাংশনটি সম্পাদনা করা ; আপনার কাছে ডেটা হস্তান্তরিত হওয়ার পরে উপস্থিত হওয়ায় এই সম্পাদনাটি নির্দ্বিধায় জানুন।
এমটি 0

1
function reverseString(string) {
    var reversedString = "";
    var stringLength = string.length - 1;
    for (var i = stringLength; i >= 0; i--) {
        reversedString += string[i];
    }
    return reversedString;
}

1

স্ট্রিংকে অ্যারেতে রূপান্তর না করে;

String.prototype.reverse = function() {

    var ret = "";
    var size = 0;

    for (var i = this.length - 1; -1 < i; i -= size) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            size = 2;
            ret += this[i - 1] + this[i];
        } else {
            size = 1;
            ret += this[i];
        }
    }

    return ret;
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());

অক্ষরগুলি কোড পয়েন্টে রূপান্তর না করেই অ্যারে.রেভার ব্যবহার করে;

String.prototype.reverse = function() {

    var array = this.split("").reverse();

    for (var i = 0; i < this.length; ++i) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            array[i - 1] = array[i - 1] + array[i];
            array[i] = array[i - 1].substr(0, 1);
            array[i - 1] = array[i - 1].substr(1, 1);
        }

    }

    return array.join("");
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());

দ্বিতীয় সংস্করণটির জন্য: var c = array[i-1]; array[i-1] = array[i]; array[i] = c;কোড জোড় সংলগ্নকরণের প্রয়োজন হয় না। এছাড়াও, লুপটি 1 থেকে শুরু হওয়া উচিত
এমটি 0

দ্বিতীয় সংস্করণটি কাজ করে না '\ud83c\ud83c\udfa5'.reverse()- এটি ইনপুট হিসাবে একই আউটপুট হবে। বিবৃতি ++i;মধ্যে যোগ করা এটি ifঠিক করা উচিত।
এমটি0

দ্বিতীয় মতামতের উপর - এটি ডায়ারিটিক্সের সংমিশ্রণটি পরিচালনা করে না: 'a\u0303bc'.reverse() === 'cba\u0303'সত্য হওয়া উচিত।
এমটি0

1

আমি মনে করি স্ট্রিং.প্রোটোটাইপ.রেভারস এই সমস্যাটি সমাধানের একটি ভাল উপায়; নীচের মত কোড;

String.prototype.reverse = function() {
  return this.split('').reverse().join('');
}

var str = 'this is a good example for string reverse';
str.reverse();
-> "esrever gnirts rof elpmaxe doog a si siht";

1

অ্যারে ফাংশন ব্যবহার করে,

String.prototype.reverse = function(){
    return [].reduceRight.call(this, function(last, secLast){return last + secLast});
}

1
var str = "my name is saurabh ";
var empStr='',finalString='';
var chunk=[];
function reverse(str){
var i,j=0,n=str.length;
    for(i=0;i<n;++i){
        if(str[i]===' '){
            chunk[j]=empStr;
            empStr = '';
            j++;
        }else{
            empStr=empStr+str[i];
        }
    }
    for(var z=chunk.length-1;z>=0;z--){
        finalString = finalString +' '+ chunk[z];
        console.log(finalString);
    }
    return true;
}
reverse(str);

এটা "জায়গায়" কেমন আছে ??
সুধনসু চৌধারি

1

আমার নিজস্ব চেষ্টা ...

var str = "The Car";

function reverseStr(str) {
  var reversed = "";
  var len = str.length;
  for (var i = 1; i < (len + 1); i++) {  
    reversed += str[len - i];      
  }

  return reversed;
}

var strReverse = reverseStr(str);    
console.log(strReverse);
// "raC ehT"

http://jsbin.com/bujiwo/19/edit?js,console,output


1

এটি শুকনো এবং সহজ বোকা রাখুন !!

function reverse(s){
let str = s;
var reverse = '';
for (var i=str.length;i>0;i--){

    var newstr = str.substring(0,i)
    reverse += newstr.substr(-1,1)
}
return reverse;
}

1

ঠিক আছে, বেশ সহজ, আপনার জন্য স্ট্রিংটি বিপরীতে করার জন্য আপনি একটি সাধারণ লুপ দিয়ে একটি ফাংশন তৈরি করতে পারেন reverse(), charAt()ইত্যাদি ইত্যাদি:

উদাহরণস্বরূপ আপনার কাছে এই স্ট্রিং রয়েছে:

var name = "StackOverflow";

এভাবে একটি ফাংশন তৈরি করুন, আমি এটি কল reverseString...

function reverseString(str) {
  if(!str.trim() || 'string' !== typeof str) {
    return;
  }
  let l=str.length, s='';
  while(l > 0) {
    l--;
    s+= str[l];
  }
  return s;
}

এবং আপনি এটি কল করতে পারেন:

reverseString(name);

এবং ফলাফলটি হবে:

"wolfrevOkcatS"

1

জাভাস্ক্রিপ্টে একটি স্ট্রিং বিপরীত করার সেরা উপায়

1) অ্যারে। রিভার্স:

আপনি সম্ভবত ভাবছেন, অপেক্ষা করুন আমি ভেবেছিলাম আমরা একটি স্ট্রিং বিপরীত করছি, আপনি কেন অ্যারে.রেভার পদ্ধতিটি ব্যবহার করছেন। স্ট্রিং.স্প্লিট পদ্ধতিটি ব্যবহার করে আমরা আমাদের স্ট্রিংকে অক্ষরের অ্যারে রূপান্তর করছি। তারপরে আমরা অ্যারেতে প্রতিটি মানের ক্রমকে বিপরীত করছি এবং তারপরে অবশেষে অ্যারে.জেইন পদ্ধতিটি ব্যবহার করে অ্যারেটিকে আবার একটি স্ট্রিংয়ে রূপান্তর করি।

function reverseString(str) {
    return str.split('').reverse().join('');
}
reverseString('dwayne');

2) যখন লুপ হ্রাস:

যদিও চমত্কার ভার্বোজ, এই সমাধানটির একাধিক সমাধানের তুলনায় এর সুবিধা রয়েছে। আপনি কোনও অ্যারে তৈরি করছেন না এবং আপনি উত্সের স্ট্রিংয়ের অক্ষরগুলির উপর ভিত্তি করে একটি স্ট্রিং সংশ্লেষ করছেন।

পারফরম্যান্সের দৃষ্টিকোণ থেকে, এটি সম্ভবত সেরা ফলাফল দেয় (যদিও অনির্ধারিত)। অত্যন্ত দীর্ঘ স্ট্রিংয়ের জন্য, পারফরম্যান্সের লাভগুলি উইন্ডোটি ছাড়িয়ে যেতে পারে।

function reverseString(str) {
    var temp = '';
    var i = str.length;

    while (i > 0) {
        temp += str.substring(i - 1, i);
        i--;
    }


    return temp;
}
reverseString('dwayne');

3) পুনরাবৃত্তি

এই সমাধানটি কতটা সহজ এবং পরিষ্কার তা আমি পছন্দ করি। আপনি পরিষ্কারভাবে দেখতে পাচ্ছেন যে স্ট্রিং.চার্ট এবং স্ট্রিং.সুবস্ট্র পদ্ধতিগুলি স্ট্রিং ফাঁকা না হওয়া পর্যন্ত প্রতিবার নিজেকে কল করে একটি আলাদা মান দিয়ে যাওয়ার জন্য ব্যবহৃত হচ্ছে যার মধ্যে টের্নারি নিজেকে কল করতে পুনরাবৃত্তি ব্যবহার না করে কেবল একটি খালি স্ট্রিং ফিরিয়ে দেয় । এটি সম্ভবত দ্বিতীয় সমাধানের পরে দ্বিতীয় সেরা পারফরম্যান্স অর্জন করবে।

function reverseString(str) {
    return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString('dwayne');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.