आप जावास्क्रिप्ट में जगह में एक स्ट्रिंग कैसे रिवर्स करते हैं?


434

जब आप अंतर्निहित फ़ंक्शन ( .reverse(), .charAt()आदि) का उपयोग किए बिना, एक फ़ंक्शन में पास (या-इन-प्लेस) को स्ट्रिंग में रिवर्स करते हैं, तो यह एक रिटर्न स्टेटमेंट के साथ एक फ़ंक्शन में जाता है ।


इसलिए, आपको स्ट्रिंग के पात्रों को प्राप्त करने के लिए .charAt () का उपयोग करने की अनुमति नहीं है?
इरविन

155
आप नहीं कर सकते। जावास्क्रिप्ट तार अपरिवर्तनीय हैं, जिसका अर्थ है कि प्रत्येक को आवंटित स्मृति को लिखा नहीं जा सकता है, जो कि "सही" के विपरीत असंभव है।
क्रिसेंट फ्रेश

2
पुन: crescentfresh की टिप्पणी देखें stackoverflow.com/questions/51185/…
बॉडटैक

1
@crescentfresh आपको एक नए उत्तर के रूप में पोस्ट करना चाहिए।
बॉडटैक

जवाबों:


736

जब तक आप सरल ASCII वर्णों के साथ काम कर रहे हैं, और आप अंतर्निहित कार्यों का उपयोग करके खुश हैं, यह काम करेगा:

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

यदि आपको एक समाधान की आवश्यकता है जो UTF-16 या अन्य मल्टी-बाइट वर्णों का समर्थन करता है, तो ध्यान रखें कि यह फ़ंक्शन अमान्य यूनिकोड स्ट्रिंग्स, या मान्य स्ट्रिंग्स जो मज़ेदार दिखाई देगा। आप इसके बजाय इस जवाब पर विचार करना चाह सकते हैं

[... एस] यूनिकोड से अवगत है, एक छोटा सा संपादन देता है: -

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

44
यह UTF-16 स्ट्रिंग्स के लिए टूट गया है, जिसमें सरोगेट जोड़े, यानी मूल बहुभाषी विमान के बाहर वर्ण हैं। यह वर्णों के संयोजन वाले तारों के लिए मजेदार परिणाम भी देगा, उदाहरण के लिए एक वर्णसंकर निम्न चरित्र पर दिखाई दे सकता है। पहला मुद्दा अमान्य यूनिकोड स्ट्रिंग्स के लिए होगा, दूसरा मान्य स्ट्रिंग्स के लिए जो मज़ेदार दिखेंगे।
मार्टिन प्रोब्स्ट

2
@Richeve Bebedor "सभी अंतर्निहित कार्यों का उपयोग किए बिना .reverse ()" यह एक स्वीकृत समाधान नहीं होगा क्योंकि यह जेएस में एक स्ट्रिंग को उलटने के लिए एक व्यवहार्य समाधान होने के बावजूद सवाल की सीमा के भीतर फिट नहीं होता है।
डेविड स्टार्क

1
@DavidStarkey: हां, लगभग चार साल बाद इस पर वापस लौटते हुए, यह देखना मुश्किल है कि मैं इस सवाल के बिंदु से पूरी तरह कैसे चूक गया। ऐसा लगता है कि मुझे बस दो मिनट इंतजार करना चाहिए था और मूल पोस्ट पर crescentfresh की टिप्पणी को उकेर देना चाहिए!
बेलाक्वा

14
@MartinProbst मेरा जवाब समस्या का एक यूनिकोड-जागरूक समाधान प्रदान करता है जो सरोगेट जोड़े और सही ढंग से अंक के संयोजन के साथ काम करता है: stackoverflow.com/a/16776380/96656
मैथियास ब्येनेंस

1
UTF-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!

यदि आप सोच रहे हैं कि ऐसा क्यों होता है, तो जावास्क्रिप्ट के आंतरिक चरित्र एन्कोडिंग पर पढ़ें । (TL; DR: 𝌆एक सूक्ष्म प्रतीक है, और जावास्क्रिप्ट इसे दो अलग-अलग कोड इकाइयों के रूप में उजागर करता है।)

लेकिन वहाँ अधिक है:

// 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 LATIN SMALL LETTER N और U + 0303 COININING TILDE)।

जिस क्रम में सरोगेट जोड़े दिखाई देते हैं उसे उलटा नहीं किया जा सकता है, अन्यथा सूक्ष्म प्रतीक 'उलट' स्ट्रिंग में दिखाई नहीं देगा। इसलिए आपने ��पिछले उदाहरण के लिए आउटपुट में उन निशानों को देखा ।

संयोजन चिह्न हमेशा पिछले प्रतीक पर लागू होते हैं, इसलिए आपको दोनों मुख्य प्रतीक (U + 006E LATIN SMALL LETTER N) को समग्र रूप से संयोजन चिह्न (U + 0303 COMBINING TILDE) के रूप में मानना ​​होगा। उनके आदेश को उलटने से स्ट्रिंग में दूसरे चिन्ह के साथ संयोजन चिह्न जुड़ जाएगा। इसलिए इसके बजाय उदाहरण आउटपुट थाñ

उम्मीद है, यह बताता है कि अब तक पोस्ट किए गए सभी उत्तर गलत क्यों हैं


अपने प्रारंभिक प्रश्न का उत्तर देने के लिए - कैसे [ठीक से] एक स्ट्रिंग को जावास्क्रिप्ट में उल्टा करें -, मैंने एक छोटा जावास्क्रिप्ट पुस्तकालय लिखा है जो यूनिकोड-जागरूक स्ट्रिंग प्रत्यावर्तन में सक्षम है। यह मेरे द्वारा उल्लिखित मुद्दों में से कोई भी नहीं है। पुस्तकालय को Esrever कहा जाता है ; इसका कोड GitHub पर है, और यह किसी भी जावास्क्रिप्ट वातावरण में बहुत काम करता है। यह शेल यूटिलिटी / बाइनरी के साथ आता है, जिससे आप आसानी से अपने टर्मिनल से स्ट्रिंग्स को उल्टा कर सकते हैं।

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

"इन-प्लेस" भाग के लिए, अन्य उत्तर देखें।


65
आपको अपने उत्तर में Esrever के कोड का मुख्य भाग शामिल करना चाहिए।
r0estir0bbe

1
@Meglio उस विशिष्ट दृष्टिकोण के साथ, हाँ।
मथियास बिएनेंस

8
समस्या, ऑफ-कोर्स, यह है कि "एक स्ट्रिंग को उल्टा" अस्पष्ट लगता है, लेकिन यह यहाँ वर्णित समस्याओं का सामना नहीं कर रहा है। क्या एक स्ट्रिंग को वापस लौटाने वाला स्ट्रिंग है जो मुद्रित होने पर स्ट्रिंग में अंगूर के समूहों को रिवर्स ऑर्डर में प्रदर्शित करेगा? एक ओर, यह संभव लगता है। दूसरी तरफ, आप कभी ऐसा क्यों करना चाहेंगे? यह परिभाषा इस पर छिपी हुई है, और एक उलटी हुई स्ट्रिंग को प्रिंट करना शायद ही उपयोगी है। एक एल्गोरिथ्म के हिस्से के रूप में, आपकी आवश्यकताएं पूरी तरह से अलग हो सकती हैं।
मार्टिज़न

19
हालांकि यह एक करता है महान समस्या को समझाने का काम है, वास्तविक जवाब है एक और महल में । जैसा कि @ r0estir0bbe ने एक साल पहले कहा था, संबंधित कोड जवाब में होना चाहिए , न कि केवल लिंक से।
टीजे क्राउडर

4
"उम्मीद है, यह बताता है कि अब तक पोस्ट किए गए सभी उत्तर गलत क्यों हैं" - यह दावा अत्यधिक बलशाली इमो है। कई उपयोग-मामलों के लिए UTF-16 समर्थन की आवश्यकता नहीं होती है (सरल उदाहरण, URL और URL घटकों / मापदंडों के साथ काम करना)। एक समाधान केवल "गलत" नहीं है क्योंकि यह गैर-आवश्यक परिदृश्य को संभालता नहीं है। विशेष रूप से, शीर्ष-मतदान जवाब स्पष्ट रूप से घोषित करता है कि यह केवल ASCII वर्णों के साथ काम करता है और इस प्रकार निश्चित रूप से थोड़ा भी गलत नहीं है।
एरोथ

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 बुरी तरह से धीमा हो सकता है
adamJLev

9
हालांकि, यूनिकोड कंपाउंड वर्ण मौजूद होने पर न तो समाधान काम करता है।
एरिक ग्रेंज

2
@JuanMendes मैंने वह टिप्पणी 2009 में छोड़ दी, पिछले 4 वर्षों में चीजें बदल गई हैं। : पी
ब्योर्न

63

विस्तृत विश्लेषण और एक स्ट्रिंग और उनके प्रदर्शन विवरण को उलटने के दस अलग-अलग तरीके।

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

इन कार्यान्वयनों की पूर्णता:

प्रति ब्राउज़र सर्वश्रेष्ठ प्रदर्शन कार्यान्वयन (ओं)

  • क्रोम 15 - इम्प्लांटेशन 1 और 6
  • फ़ायरफ़ॉक्स 7 - कार्यान्वयन 6
  • IE 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
मैं कम से कम यह कह सकता हूं कि मेरे पास एक साक्षात्कारकर्ता था जब मैं जेएस में एक स्ट्रिंग "इन-प्लेस" को रिवर्स करने का तरीका पूछने पर बहुत प्रभावित हुआ था और मैंने समझाया कि जेएस में तार के बाद से इसका असंभव क्यों अपरिवर्तनीय है। मुझे नहीं पता कि क्या वह जवाब था जिसकी उन्हें उम्मीद थी या अगर मैंने उन्हें थोड़ा शिक्षित किया। किसी भी तरह से यह ठीक काम किया;)
Chev

1
हो सकता है कि वह एक कचरा संग्राहक द्वारा "प्रबंधित" का अर्थ है, कम से कम वह है जो आमतौर पर "प्रबंधित भाषा" या वर्चुअल मशीन / वर्चुअल रनटाइम पर्यावरण की उपस्थिति से अभिप्राय है? @torazaburo
AntonB

39

सबसे पहले, Array.from()एक स्ट्रिंग को एक सरणी में बदलने के लिए, फिर सरणी Array.prototype.reverse()को उलटने के लिए और फिर Array.prototype.join()इसे वापस स्ट्रिंग बनाने के लिए उपयोग करें।

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

यह ओवरहेड हो गया है, लेकिन यह एक सुंदर समाधान है! पहले से मौजूद reverseतर्क का कोई पुनर्लेखन नहीं है।
गेरशोम

2
@felixfbecker नहीं, string.split('')काम नहीं करता है। अधिक स्पष्टीकरण के लिए इस उत्तर को देखें ।
माइकल पेरोलकोव्स्की

5
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह यूनिकोड के साथ भी काम करता है। जैसे, ऊपर दिए गए उदाहरण से:Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
जूलियन TF

3
@JulianTF वास्तव में नहीं, एक टिल्ड अभी भी 'एन' के बजाय 'ए' पर लागू होता है।
रोमन बोइको

2
@RomanBoiko सच है, लेकिन आप पहले स्ट्रिंग को सामान्य कर सकते हैं। Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')बन जाएगा"anañam anañam rab 𝌆 oof"
श्री लिस्टर

26

ECMAScript 6 में, आप स्प्रेड.split('') विधि का उपयोग किए बिना किसी स्ट्रिंग को तेजी से उल्टा कर सकते हैं , जैसे स्प्रेड ऑपरेटर के साथ :

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

1
ES6 आपको ('')

इस मामले में दो backticks का उपयोग करने का कोई कारण नहीं है
विक

1
जब तक आप कोड गोल्फिंग नहीं करते हैं तब तक आपको इससे बचना चाहिए। लेखन string.split('')ज्यादातर लोगों की तुलना में स्पष्ट है [...string]
अन्नानफे

1
@AnnanFay .split('')में अनुपूरक विमानों (UTF-16 में सरोगेट जोड़े) के पात्रों के साथ समस्या है, क्योंकि यह कोड बिंदु के बजाय UTF-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, हालांकि आप इसे प्रोटोटाइप के साथ नकली करने में सक्षम हो सकते हैं।

उपरोक्त डेमो कार्यान्वयन, Rev RevStString प्रकार का एक नया ऑब्जेक्ट बनाता है। यह प्रोटोटाइप है, और इसलिए काफी कुशल है, लगभग न्यूनतम काम और न्यूनतम स्थान के साथ ओवरहेड (प्रोटोटाइप परिभाषाएं साझा की जाती हैं)। यह एक आलसी कार्यान्वयन है जिसमें आस्थगित कताई शामिल है। जब भी आप किसी फ़ंक्शन को पसंद करते हैं .sliceया .reversed, यह इंडेक्स गणित का प्रदर्शन करेगा। अंत में जब आप डेटा निकालते हैं (संक्षेप में कॉल करके .toString()या.charCodeAt(...) कुछ और करके), तो यह "स्मार्ट" तरीके से लागू होगा, कम से कम डेटा को छू सकता है।

नोट: उपरोक्त स्ट्रिंग एपीआई एक उदाहरण है, और इसे पूरी तरह से लागू नहीं किया जा सकता है। आप केवल 1-2 फ़ंक्शन का उपयोग कर सकते हैं, जिनकी आपको आवश्यकता है।


13

कई तरीके हैं जो आप जावास्क्रिप्ट में एक स्ट्रिंग को उल्टा कर सकते हैं। मैं उन तीन तरीकों को पसंद कर रहा हूं जो मुझे पसंद हैं।

दृष्टिकोण 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

एक साक्षात्कार के दौरान, मुझे किसी भी चर या देशी तरीकों का उपयोग किए बिना एक स्ट्रिंग को रिवर्स करने के लिए कहा गया था। यह मेरा पसंदीदा कार्यान्वयन है:

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

लघु, सरल, लेकिन नरक के रूप में धीमा;)
टॉम

13
शून्य देशी तरीके? किस बारे में slice? : - /
पत्ती

1
पुनरावृत्ति का दिलचस्प उपयोग। विडंबना यह है कि यह स्टैक ओवरफ्लो पर है। stackoverflow.com/q/2805172/265877
एलेक्स

@ एलेक्स, आप एक अच्छा बिंदु बनाते हैं। कुछ मामलों में, साक्षात्कारकर्ता आपको उपयोग न करने के लिए कहेगा 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!"));

2. पारंपरिक लूप के लिए (डिक्रिमेंटिंग):

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

3. लूप के लिए उपयोग करना

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

6. नवीनतम तरीका:

function reverseString(str){

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

alert(reverseString("Learning JavaScript"));

7. आपको निम्नलिखित का उपयोग करके भी परिणाम मिल सकता है,

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
यह अच्छा है कि आपने अपने उदाहरण में एक इमोजी को शामिल किया है। ताकि हम जल्दी से देखें कि यह स्पष्ट रूप से इमोजीस और अन्य यूनिकोड वर्णों के लिए बहुत काम नहीं करता है।
48होर मे

विश्वास, जबकि आपका उत्तर सही है, मैं असहमत हूं कि यह सबसे आसान तरीका है। पहले कई उत्तर इसका उपयोग 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(''));

// आउटपुट: 'gnirts elpmas'


आपके पूरे 'map` भाग को लिखा जा सकता है [...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)बजाय है 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

स्टैक ओवरफ़्लो प्राप्त करने की कोशिश करने के लिए, मैंने Google Chrome में परिवर्तन 1000किया 10000, और यह बताया:

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

एक योग्य प्रयास, लेकिन अगर आप यूनिकोडडैट.टैक्स फ़ाइल को स्कैन करने के लिए थे, तो आप पाएंगे कि ५.११ के बजाय ५.३ के बजाय डायक्टिक के संयोजन की ऐसी ३० but रेंज हैं
श्री लिस्टर

@Mrister तब समाधान isCombiningDiacriticको सभी 316 सीमाओं को शामिल करने के लिए फ़ंक्शन को संपादित करना है; जब आप डेटा को हाथ लगाने के लिए प्रस्तुत करते हैं, तो उस संपादन को बेझिझक करें।
MT0

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

वर्णों को कोड बिंदुओं में परिवर्तित किए बिना Array.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.11

दूसरा संस्करण काम नहीं करता है '\ud83c\ud83c\udfa5'.reverse()- यह इनपुट के समान आउटपुट देगा। बयान के ++i;भीतर जोड़कर ifइसे ठीक करना चाहिए।
MT0

दूसरे विचारों पर - यह नृतत्वशास्त्र के संयोजन को नहीं संभालता है: 'a\u0303bc'.reverse() === 'cba\u0303'सच लौटना चाहिए।
MT0

1

मुझे लगता है कि String.prototyp.reverse इस समस्या को हल करने का एक अच्छा तरीका है; नीचे के रूप में कोड;

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

इसे DRY और सरल मूर्खतापूर्ण रखें !!

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) Array.reverse:

आप शायद सोच रहे हैं, रुको मुझे लगा कि हम एक स्ट्रिंग को उल्टा कर रहे थे, आप ऐरे.वेवर्स विधि का उपयोग क्यों कर रहे हैं। String.split पद्धति का उपयोग करके हम अपने स्ट्रिंग को वर्णों के एक सरणी में परिवर्तित कर रहे हैं। फिर हम एरे में प्रत्येक मान के क्रम को उलट रहे हैं और फिर अंत में हम ऐरे को वापस आकर स्ट्रिंग में बदल देते हैं।

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) पुनरावृत्ति

मुझे पसंद है कि यह समाधान कितना सरल और स्पष्ट है। आप स्पष्ट रूप से देख सकते हैं कि String.charAt और String.substr विधियों का उपयोग प्रत्येक बार खुद कॉल करके एक अलग मान से गुजरने के लिए किया जा रहा है, जब तक कि स्ट्रिंग खाली न हो जाए, जब तक टर्नरी स्वयं को कॉल करने के लिए पुनरावर्तन का उपयोग करने के बजाय एक खाली स्ट्रिंग वापस कर देगा। । यह संभवतः दूसरे समाधान के बाद दूसरा सर्वश्रेष्ठ प्रदर्शन होगा।

function reverseString(str) {
    return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString('dwayne');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.