2012-01-15 17 views
7

क्योंकॉल [] .reverse एक स्ट्रिंग पर

[].reverse.call("string"); 

(दोनों फ़ायरफ़ॉक्स में त्रुटि और यानी, क्रोम में मूल स्ट्रिंग रिटर्न) में विफल रहता है एक स्ट्रिंग काम पर अन्य सभी सरणियों तरीकों बुला जबकि करता है?

>>> [].splice.call("string",3) 
["i", "n", "g"] 
>>> [].map.call("string",function (a) {return a +a;}) 
["ss", "tt", "rr", "ii", "nn", "gg"] 
+0

_ "अन्य सभी सरणी विधियां" _ - '.sort()' काम करता है? काम करने वाले लोगों के लिए, क्या वे सभी ब्राउज़रों में काम करते हैं? (मुझे लगता है कि वे पुराने ब्राउज़रों के लिए असफल हो जाएंगे जिन्होंने तारों के लिए सरणी शैली '[] 'इंडेक्स नोटेशन लागू नहीं किया है, हालांकि मैंने इसका परीक्षण नहीं किया है।) – nnnnnn

+0

@nnnnnn सॉर्ट उसी कारण से काम नहीं करता है – Hai

+0

@ हैई: एफवाईआई, '.plice()' वास्तव में काम नहीं करता है। क्रोम आपको लौटा मूल्य देने के लिए बहुत दयालु है, लेकिन यदि आप इसे विभाजित करने से पहले मूल स्ट्रिंग का संदर्भ देते हैं, तो आप पाएंगे कि यह संशोधित नहीं है। –

उत्तर

8

क्योंकि .reverse() एक ऐरे को संशोधित करता है, और तार अपरिवर्तनीय हैं।


आप Array.prototype.slice उधार किसी सरणी में बदलने का है, तो रिवर्स और यह शामिल होने के लिए कर सकता है।

var s = "string"; 

var s2 = [].slice.call(s).reverse().join(''); 

बस ध्यान रखें कि IE के पुराने संस्करणों में, आप एक सरणी की तरह एक स्ट्रिंग में हेरफेर नहीं कर सकते हो।

+1

अच्छी तरह से किया - ब्रेवटी बुद्धि की आत्मा है –

+1

@AdamRackis: धन्यवाद, लेकिन अब मैं चला गया हूं और आपके पूरक को खराब कर दिया है। :) –

+0

@amnotiam, मुझे बहुत देर हो चुकी है, क्षमा करें। – OnTheFly

4

देखें @ नहीं, मुझे जवाब है कि यह क्यों काम नहीं करता है। हालांकि, अगर आप यह कैसे पूरा करने के लिए जानना चाहता हूँ, यह पहली एक सरणी में बदलने का:

"string".split('').reverse().join(''); // "gnirts" 
+0

+1 '.split()' '[] .slice()' से अधिक ब्राउज़र संगत सरणी रूपांतरण होगा। –

5

निम्नलिखित तकनीक (या समान) आमतौर पर जावास्क्रिप्ट में एक स्ट्रिंग को उल्टा करने के लिए किया जाता है:

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

वास्तव में, अब तक पोस्ट किए गए सभी उत्तर इस पैटर्न की भिन्नता हैं। हालांकि, इस समाधान के साथ कुछ समस्याएं हैं। उदाहरण के लिए:

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

आप सोच रहे हैं कि ऐसा क्यों होता है, read up on JavaScript’s internal character encoding

: (टी एल डॉ। एक सूक्ष्म प्रतीक है, और जावास्क्रिप्ट दो अलग-अलग कोड इकाइयों के रूप में यह उजागर करता है) लेकिन वहाँ और भी है:

// 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. 

एक अच्छा स्ट्रिंग स्ट्रिंग रिवर्स कार्यान्वयन का परीक्षण करने के the following है:

'foo bar mañana mañana' 

क्यों? क्योंकि इसमें एक सूक्ष्म प्रतीक () (जो represented by surrogate pairs in JavaScript हैं) और एक संयोजन चिह्न ( अंतिम mañana में वास्तव में दो प्रतीकों होते हैं: यू +006 ई लैटिन लघु पत्र एन और यू +0303 संयोजन टिल्ड)।

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

संयोजन अंक हमेशा पिछले प्रतीक पर लागू होते हैं, इसलिए आपको मुख्य प्रतीक (यू +006 ई लैटिन लघु पत्र एन) दोनों को संयोजन चिह्न (यू +0303 संयोजन टिल्ड) के रूप में पूरी तरह से इलाज करना होगा। उनके आदेश को उलट करने से संयोजन चिह्न को स्ट्रिंग में किसी अन्य प्रतीक के साथ जोड़ा जाएगा। यही कारण है कि उदाहरण आउटपुट ñ के बजाय था।

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


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

var input = 'foo bar mañana mañana'; 
esrever.reverse(input); 
// → 'anañam anañam rab oof' 
संबंधित मुद्दे