एक स्ट्रिंग को उल्टा कैसे करें जिसमें जटिल इमोजीज हैं?


194

इनपुट:

Hello world👩‍🦰👩‍👩‍👦‍👦

वांछित आउटपुट:

👩‍👩‍👦‍👦👩‍🦰dlrow olleH

मैंने कई तरीकों की कोशिश की लेकिन किसी ने भी मुझे सही जवाब नहीं दिया।

यह बुरी तरह से विफल रहा:

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';

const reversed = text.split('').reverse().join('');

console.log(reversed);

यह थोड़े काम करता है लेकिन यह 👩‍👩‍👦‍👦4 अलग-अलग इमोजी में टूट जाता है:

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';

const reversed = [...text].reverse().join('');

console.log(reversed);

मैंने इस सवाल का हर उत्तर देने की कोशिश की लेकिन उनमें से कोई भी काम नहीं करता है।

क्या वांछित आउटपुट प्राप्त करने का कोई तरीका है?


26
मैं दूसरे समाधान के साथ समस्या नहीं देख सकता। मैं क्या खो रहा हूँ?
पेड्रो लीमा

13
तो ये इमोजी वास्तव में किसी भी तरह के कॉम्बिनेटर इमोजी हैं, यह काफी दिलचस्प है। सबसे पहले, आपके पास महिला का चेहरा इमोजी है, जो खुद आपके दो पात्रों का प्रतिनिधित्व करता है , और फिर एक अतिरिक्त कनेक्टिंग चरित्र है, जो कि चारकोड 8205 है, और फिर एक और दो है जो "लाल बाल" का प्रतिनिधित्व करते हैं, और उन 5 पात्रों को एक साथ करते हैं। मतलब 'लाल बालों के साथ
महिलाएं

11
ठीक से संयुक्त इमोजीस के साथ एक स्ट्रिंग को उल्टा करने के लिए बहुत जटिल होगा, मुझे लगता है। आपको यह देखना होगा कि प्रत्येक इमोजी के बाद चारकोड 8205 है या नहीं, और यदि ऐसा है तो आपको इसे स्वयं के चरित्र के रूप में मानने के बजाय पिछले इमोजी के साथ जोड़ना होगा। बहुत जटिल ...
TKoL

19
जावास्क्रिप्ट मुझे भ्रमित करता है। यह निम्न और उच्च स्तरीय भाषा अवधारणाओं का सबसे अजीब मिश्रण है। यह इस स्तर पर है कि यह पूरी तरह से स्मृति (कोई संकेत नहीं, मैनुअल मेमोरी प्रबंधन) को अमूर्त करता है, लेकिन निम्न स्तर के रूप में स्ट्रिंग्स को डब कोड पॉइंट के रूप में विस्तारित ग्रैफेमी क्लस्टर्स के रूप में मानता है। यह वास्तव में भ्रामक है, और यह मुझे कभी नहीं पता चलता है कि इस चीज के साथ काम करते समय क्या उम्मीद की जाए।
अलेक्जेंडर

12
@ सिकंदर-ReinstateMonica वहाँ है कि किसी भी भाषा है करता है डिफ़ॉल्ट रूप से ग्रफीम बंटवारे से बंटवारे? जेएस यूटीएफ -16 में एनकोडेड मानक तार प्रदान करता है।
लाइट्स ०१२३

जवाबों:


94

यदि आप कर रहे हैं, उपयोग करने में सक्षम _.split()द्वारा प्रदान समारोह lodash । से 4.0 संस्करण के बाद से, _.split()बंटवारे यूनिकोड emojis में सक्षम है।

.reverse().join('')'वर्णों' को उलटने के लिए मूल का उपयोग करते हुए शून्य-चौड़ाई वाले योजकों वाले इमोजीस के साथ ठीक काम करना चाहिए

function reverse(txt) { return _.split(txt, '').reverse().join(''); }

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';
console.log(reverse(text));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>


3
चैंज आप जिस बिंदु पर इंगित करते हैं "v4.9.0 - सुनिश्चित _.split emojis के साथ काम करता है", मुझे लगता है कि 4.0 बहुत जल्दी हो सकता है। उस कोड में टिप्पणी जो स्ट्रिंग्स ( github.com/lodash/lodash/blob/4.17.15/lodash.js#L261 ) को विभाजित करने के लिए प्रयोग किया जाता है, mathiasbynens.be.notes/javascript-unicode को देखें जो 2013 से है। ऐसा लगता है कि यह तब से आगे बढ़ गया है, लेकिन यह बहुत अधिक यूनिकोड रीगेक्स को समझने में बहुत मुश्किल काम करता है। मैं भी यूनिकोड विभाजन के लिए उनके कोडबेस में कोई परीक्षण नहीं देख सकता। यह सब मुझे उत्पादन में उपयोग करने से सावधान करेगा।
माइकल एंडरसन

5
यह खोजने में थोड़ी खोज हुई कि यह विफल हो जाता है reverse("뎌쉐") (2 कोरियाई अंगूर) जो "ᅰ셔 searching" (3 अंगूर) देता है।
माइकल एंडरसन

2
ऐसा लगता है कि इस समस्या का कोई आसान देशी हल नहीं है। केवल इसे हल करने के लिए एक पुस्तकालय आयात करना पसंद नहीं करेंगे, लेकिन यह वास्तव में इस बिंदु पर ऐसा करने का सबसे विश्वसनीय / सुसंगत तरीका है।
हाओ वू

1
इस Windows10 पर फ़ायरफ़ॉक्स में सही ढंग से काम करने के लिए हो रही 😎 दिशा लेखन पीछे के लिए कुडोस अभी भी एक सुबह बालक glitchy (बच्चों रियर में समाप्त), इसलिए lodash हरा है Windows 10, मुझे लगता है, जो की संभावना कुछ हद तक एक कम बजट 😅
Yeoman

54

मैंने \u200dचरित्र का उपयोग करने के लिए टीकेओएल का विचार लिया और इसका उपयोग एक छोटी स्क्रिप्ट बनाने के प्रयास में किया।

नोट: सभी रचनाएं एक शून्य चौड़ाई योजक का उपयोग नहीं करती हैं, इसलिए यह अन्य रचना पात्रों के साथ छोटी गाड़ी होगी।

यह पारंपरिक forलूप का उपयोग करता है क्योंकि हम संयुक्त इमोटिकॉन्स खोजने के मामले में कुछ पुनरावृत्तियों को छोड़ देते हैं। forलूप के भीतर यह whileजांचने के लिए एक लूप है कि क्या कोई निम्न \u200dवर्ण है। जब तक एक है हम अगले 2 वर्णों को भी जोड़ते हैं और for2 पुनरावृत्तियों के साथ लूप को आगे बढ़ाते हैं ताकि संयुक्त इमोटिकॉन्स उलट न हों।

किसी भी स्ट्रिंग पर आसानी से उपयोग करने के लिए मैंने इसे स्ट्रिंग ऑब्जेक्ट पर एक नए प्रोटोटाइप फ़ंक्शन के रूप में बनाया।

String.prototype.reverse = function() {
  let textArray = [...this];
  let reverseString = "";

  for (let i = 0; i < textArray.length; i++) {
    let char = textArray[i];
    while (textArray[i + 1] === '\u200d') {
      char += textArray[i + 1] + textArray[i + 2];
      i = i + 2;
    }
    reverseString = char + reverseString;
  }
  return reverseString;
}

const text = "Hello world👩‍🦰👩‍👩‍👦‍👦";

console.log(text.reverse());

//Fun fact, you can chain them to double reverse :)
//console.log(text.reverse().reverse());


5
मैं सोच रहा था, जब आप ब्राउज़रों पर पाठ को खींचते हैं और चुनते हैं, तो 👩‍👩‍👦‍👦केवल एक पूरे के रूप में चुना जा सकता है। ब्राउज़रों को कैसे पता चलता है कि यह एक वर्ण है? क्या इसमें एक अंतर्निहित तरीका है?
हाओ वू

10
@HaoWu यह "ग्रैफेम क्लस्टर्स" पर "यूनिकोड सेगमेंटेशन" के रूप में जाना जाता है। आपका ब्राउज़र (जो आपके OS द्वारा प्रदत्त एक का उपयोग कर सकता है) प्रति ग्रेपम क्लस्टर के चयन और रेंडर करने की अनुमति देने वाला है। आप यहाँ युक्ति पढ़ सकते हैं: unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries
lights0123

7
@HauWu: "ब्राउज़र कैसे जानते हैं कि यह एक चरित्र है?" - यह नहीं "एक चरित्र"। यह कई एक भी फार्म का संयोजन वर्ण है ग्रफीम क्लस्टर , एक एकल के रूप में प्रदान ग्लिफ़
जोर्ग डब्ल्यू मित्तग

6
यहाँ भी वही ; सभी रचनाएँ एक शून्य चौड़ाई योजक का उपयोग नहीं करती हैं।
होल्गर

6
यह ZWJ के साथ रचित कुछ भी लेकिन पात्रों को सही ढंग से उलट नहीं करता है। कृपया, न केवल यहां बल्कि एक सामान्य नियम के रूप में, उन लोगों द्वारा लिखे गए बाहरी पुस्तकालयों का उपयोग करें जो जानते हैं कि वे क्या कर रहे हैं, एक परीक्षण मामले के लिए काम करने वाले बीस्पोक समाधानों को हैक करने के बजाय। रून्स और lodash पुस्तकालयों (मैं या तो समर्थन नहीं कर सकता) अन्य उत्तर में सिफारिश कर रहे थे।
benrg

47

यूनिकोड पाठ को उलटना कई कारणों से मुश्किल है।

सबसे पहले, प्रोग्रामिंग भाषा के आधार पर, स्ट्रिंग्स को अलग-अलग तरीकों से दर्शाया जाता है, या तो बाइट्स की सूची के रूप में, UTF-16 कोड इकाइयों की एक सूची (16 बिट्स चौड़ी, जिसे अक्सर एपीआई में "वर्ण" कहा जाता है), या ucs4 कोड बिंदुओं के रूप में (4 बाइट्स चौड़ी)।

दूसरा, अलग-अलग एपीआई उस आंतरिक प्रतिनिधित्व को अलग-अलग डिग्री पर दर्शाते हैं। कुछ बाइट्स के अमूर्त पर काम करते हैं, कुछ UTF-16 वर्णों पर, कुछ कोड बिंदुओं पर। जब प्रतिनिधित्व बाइट्स या यूटीएफ -16 वर्णों का उपयोग करता है, तो आमतौर पर एपीआई के कुछ हिस्से होते हैं जो आपको इस प्रतिनिधित्व के तत्वों तक पहुंच प्रदान करते हैं, साथ ही साथ वे भाग जो बाइट्स (यूटीएफ -8 के माध्यम से) से प्राप्त करने के लिए आवश्यक तर्क करते हैं। वास्तविक कोड बिंदुओं के लिए UTF-16 वर्ण।

अक्सर, एपीआई के भाग उस तर्क का प्रदर्शन करते हैं और इस तरह आपको कोड बिंदुओं तक पहुंच प्रदान करते हैं, बाद में जोड़ा गया है, क्योंकि पहले 7 बिट एससीआई थी, फिर थोड़ा बाद में सभी ने सोचा कि 8 बिट्स पर्याप्त थे, विभिन्न कोड पेजों का उपयोग करते हुए, और यहां तक ​​कि बाद में यूनिकोड के लिए 16 बिट्स पर्याप्त थे। एक निश्चित ऊपरी सीमा के बिना पूर्णांक संख्याओं के रूप में कोड बिंदुओं की धारणा ऐतिहासिक रूप से तार्किक रूप से एन्कोडिंग पाठ के लिए चौथी आम चरित्र लंबाई के रूप में जोड़ी गई थी।

एक एपीआई का उपयोग करना जो आपको वास्तविक कोड बिंदुओं तक पहुंच देता है, ऐसा लगता है कि यह ऐसा है। परंतु...

तीसरा, अगले कोड बिंदु या निम्नलिखित कोड बिंदुओं को प्रभावित करने वाले बहुत सारे संशोधक कोड बिंदु हैं। जैसे कि एक डियाक्रिटिक संशोधक निम्नलिखित है जो एक ä, e से ë, & c में बदल जाता है। कोड बिंदुओं को चारों ओर घुमाएं, और अलग-अलग अक्षरों से बना, और बन जाता है। उदाहरण के लिए अपने स्वयं के कोड बिंदु के रूप में ä का प्रत्यक्ष प्रतिनिधित्व है, लेकिन संशोधक का उपयोग करना उतना ही मान्य है।

चौथा, सब कुछ निरंतर प्रवाह में है। इमोजी के बीच बहुत सारे संशोधक भी हैं, जैसा कि उदाहरण में उपयोग किया जाता है, और हर साल अधिक जोड़े जाते हैं। इसलिए, यदि एक एपीआई आपको जानकारी देता है कि क्या कोड बिंदु एक संशोधक है, तो एपीआई का संस्करण यह निर्धारित करेगा कि क्या यह पहले से ही एक विशिष्ट नया संशोधक जानता है।

यूनिकोड एक हैकी ट्रिक प्रदान करता है, हालांकि, जब यह केवल दृश्य उपस्थिति के बारे में है:

लेखन दिशा-निर्देश हैं। उदाहरण के मामले में, बाएं से दाएं लेखन दिशा का उपयोग किया जाता है। बस टेक्स्ट की शुरुआत में राइट-टू-लेफ्ट राइटिंग डायरेक्शन मॉडिफ़ायर जोड़ें और एपीआई / ब्राउज़र के संस्करण के आधार पर, यह सही उलटा दिखेगा to

'\ u202e' को दाएं से बाएं ओवरराइड कहा जाता है, यह दाएं से बाएं मार्कर का सबसे मजबूत संस्करण है।

इस स्पष्टीकरण को w3.org द्वारा देखें

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦'
console.log('\u202e' + text)

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦'
let original = document.getElementById('original')
original.appendChild(document.createTextNode(text))
let result = document.getElementById('result')
result.appendChild(document.createTextNode('\u202e' + text))
body {
  font-family: sans-serif
}
<p id="original"></p>
<p id="result"></p>


8
बीड़ी का +1 बहुत रचनात्मक उपयोग (-: यह '\u202e' + text + '\u202c'निम्नलिखित पाठ को प्रभावित करने से बचने के लिए POP DIRECTIONAL FORMATTING char के साथ ओवरराइड को बंद करने के लिए सुरक्षित है ।
बेनी चेरनियाव्स्की-पास्किन

2
धन्यवाद I यह काफी हॅकी ट्रिक है और मैंने जो लेख जोड़ा है वह बहुत विस्तार से बताता है कि यह HTML विशेषताओं का उपयोग करने के लिए होशियार क्यों है, लेकिन इस तरह मैं सिर्फ अपने हैक के लिए स्ट्रिंग संयोजन का उपयोग कर सकता हूं
योमन

7
Btw। इस मशीन पर मेरा फ़ायरफ़ॉक्स (10 जीत) पूरी तरह से सही नहीं है, बच्चे माता-पिता के पीछे हैं जब दाएं से बाएं लिख रहे हैं, तो मुझे लगता है कि इन बड़े पैमाने पर जटिल इमोजी समूहों-के-जन संशोधक के साथ राइटिंग दिशा प्राप्त करना कठिन है। ..
तुर्क

2
एक और मजेदार बढ़त का मामला: ध्वज सूचक के लिए उपयोग किए जाने वाले क्षेत्रीय संकेतक प्रतीक। यदि आप स्ट्रिंग "🇦🇨" लेते हैं (दो कोड यू + 1 एफ 1 ई 6, यू + 1 एफ 1 ई 8, आरोही द्वीप के लिए ध्वज बनाते हैं) और इसे भोलेपन से उलटने की कोशिश करते हैं, तो आपको "🇨🇦", कनाडा का झंडा मिलता है।
एडम रोसेनफील्ड

2
@yeoman FYI: "UTF-16 वर्ण" (जैसा कि आप यहां शब्द का उपयोग कर रहे हैं) अन्यथा "UTF-16 वर्ण इकाइयों " के रूप में जाना जाता है । "चरित्र" एक शब्द के बहुत अस्पष्ट हो जाता है क्योंकि यह बहुत सारी चीजों को संदर्भित कर सकता है (लेकिन यूनिकोड के संदर्भ में आमतौर पर एक कोड बिंदु है)।
आभास

39

मुझे पता है! मैं RegExp का उपयोग करूंगा। क्या गलत हो सकता था? (उत्तर पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया।)

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';

const reversed = text.match(/.(\u200d.)*/gu).reverse().join('');

console.log(reversed);


5
आपका उत्तर क्षमाप्रार्थी लगता है लेकिन, ईमानदारी से, मैं इस उत्तर को कैनोनिकल के करीब कहूंगा। यह निश्चित रूप से अन्य उत्तरों से बेहतर है कि मैन्युअल रूप से एक ही काम करने का प्रयास किया जाए। चरित्र-आधारित पाठ हेरफेर वह है जो रेगेक्स के लिए डिज़ाइन किया गया है और उस पर एक्सेल है, और यूनिकोड कंसोर्टियम स्पष्ट रूप से आवश्यक रेगेक्स सुविधाओं का मानकीकरण करता है (जो कि ECMAScript इस उदाहरण में, सही ढंग से लागू करने के लिए होता है)। इसने कहा, यह संयोजन वर्णों को संभालने में विफल रहता है (जिसे IIRC regex को. वाइल्डकार्ड के साथ संभालना चाहिए )।
कोनराड रुडोल्फ

14
रचनाओं के साथ काम नहीं करता है U+200D, जैसे के साथ निर्मित नहीं है 🏳️‍🌈। यह ध्यान देने योग्य है कि रचित पात्र भी इमोजी दुनिया के बाहर मौजूद हैं ...
होल्गर

2
@StevenPenny enny🌈🌈 में दो रचनाएँ हैं और उनमें से एक का उपयोग नहीं किया गया है U+200D। यह सत्यापित करना आसान है कि --🌈🌈 इस जवाब के कोड के साथ काम नहीं करता है ...
Holger

1
@Holger जबकि यह सच है कि composition olol में U + 200D के साथ कोई रचना नहीं है, इसका बहुत बुरा उदाहरण है क्योंकि इसमें U + 200D के साथ एक रचना भी शामिल है। एक बेहतर उदाहरण कुछ ऐसा होगा would या example
स्टीवन पेनी

3
यहां अन्य टिप्पणियों के विपरीत, शून्य-चौड़ाई-योजक के प्रत्येक उपयोग को एक एकल अंगूर समूह के रूप में नहीं माना जाना चाहिए। उदाहरण के लिए, यूनिकोड 13 ग्रैफेम टेस्ट ( unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakTest.txt ) की अंतिम तीन पंक्तियाँ तीन ऐसे ही मामले दिखाती हैं, जहाँ ZWJ को अलग तरह से संभाला जाता है।
माइकल एंडरसन

32

वैकल्पिक समाधान runesपुस्तकालय, छोटे लेकिन प्रभावी समाधान का उपयोग करना होगा :

https://github.com/dotcypress/runes

const runes = require('runes')

// String.substring
'👨‍👨‍👧‍👧a'.substring(1) => '�‍👨‍👧‍👧a'

// Runes
runes.substr('👨‍👨‍👧‍👧a', 1) => 'a'

runes('12👩‍👩‍👦‍👦3🍕✓').reverse().join(); 
// results in: "✓🍕3👩‍👩‍👦‍👦21"

3
यह सबसे अच्छा जवाब tbh है। इन सभी अन्य उत्तरों में ऐसे मामले हैं जहां वे विफल होते हैं, यह पुस्तकालय (उम्मीद है) सभी किनारे मामलों को पूरा करता है।
कार्सन ग्राहम

1
यह मज़ेदार है कि पहली नज़र में इस तरह के "एक साधारण सवाल" को हल करना आसान काम नहीं है। कार्सन के साथ सहमत - पुस्तकालय, उम्मीद है, अपडेट और परिवर्तनों के साथ आगे बढ़ेगा क्योंकि एमोजिस विकसित होता रहता है।
अर्निस जुरगा

3
ऐसा लगता है कि लगभग 3 वर्षों से अपडेट नहीं किया गया है। उस समय के बारे में यूनिकोड 11 जारी किया गया था, लेकिन तब से चीजें बदल गई हैं, यूनिकोड 13 बाद में जारी किया गया है। विस्तारित अंगूर के नियमों में 13. में कुछ बदलाव हुए थे, इसलिए कुछ किनारे मामले हो सकते हैं जो इसे संभाल नहीं करते हैं। (मैंने कोड के माध्यम से नहीं देखा है - लेकिन इसके साथ सावधान रहने के लायक है)
माइकल एंडरसन

2
मैं @MichaelAnderson से सहमत हूं, यह लाइब्रेरी एक भोली या पुरानी एल्गोरिथ्म का उपयोग करती प्रतीत होती है। इसे ठीक से करने के लिए इसे यूनिकोड में निर्दिष्ट ग्रेपमे सेगमेंट एल्गोरिथ्म का उपयोग करना चाहिए ।
इंकिंग

21

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

इन समूहों में एक स्ट्रिंग को तोड़ना मुश्किल है (उदाहरण के लिए इन यूनिकोड डॉक्स को देखें )। मैं इसे स्वयं लागू करने पर भरोसा नहीं करूंगा लेकिन एक मौजूदा पुस्तकालय का उपयोग करूंगा। Google ने मुझे ग्रेपमे-स्प्लिटर लाइब्रेरी की ओर इशारा किया । इस लाइब्रेरी के डॉक्स में कुछ अच्छे उदाहरण हैं जो अधिकांश कार्यान्वयनों की यात्रा करेंगे:

इसका उपयोग करते हुए आपको लिखना चाहिए:

var splitter = new GraphemeSplitter();
var graphemes = splitter.splitGraphemes(string);
var reversed = graphemes.reverse().join('');

ASIDE: भविष्य के दर्शकों के लिए, या उन लोगों के लिए जो खून बह रहा किनारे पर रहना चाहते हैं:

वहाँ एक है प्रस्ताव जावास्क्रिप्ट मानक करने के लिए एक ग्रफीम segmenter जोड़ने के लिए। (यह वास्तव में अन्य सेगमेंटिंग विकल्प भी प्रदान करता है)। यह इस समय स्वीकृति के लिए चरण 3 की समीक्षा में है और वर्तमान में JSC और V8 ( https://github.com/tc39/proposal-intl-seacter/issues/114 देखें ) में लागू किया गया है ।

इस कोड का उपयोग करने की तरह दिखेगा:

var segmenter = new Intl.Segmenter("en", {granularity: "grapheme"})
var segment_iterator = segmenter.segment(string)
var graphemes = []
for (let {segment} of segment_iterator) {
    graphemes.push(segment)
}
var reversed = graphemes.reverse().join('');

अगर आप मुझसे ज्यादा आधुनिक जावास्क्रिप्ट जानते हैं तो आप शायद इसे बना सकते हैं ...

यहां एक कार्यान्वयन है - लेकिन मुझे नहीं पता कि इसकी क्या आवश्यकता है।

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


1
ऐसा लगता है कि कोड लगभग 2 वर्षों से अपडेट नहीं किया गया है - इसलिए इसकी तालिकाएँ अद्यतित नहीं हो सकती हैं। इसलिए आपको हाल ही में कुछ खोजने की आवश्यकता हो सकती है।
माइकल एंडरसन

3
ऐसा लगता है कि इस लाइब्रेरी का एक और हालिया कांटा github.com/flmnt/graphemer
माइकल एंडरसन

4
मुझे आश्चर्य है कि वास्तव में सही होने वाले उत्तर को देखने के लिए मुझे इसे नीचे स्क्रॉल करना पड़ा।
लैंबडा फेयरी

1
प्रस्ताव उदाहरण के लिए आप कर सकते हैं const graphemes = Array.from(segment_iterator, ({segment}) => segment)
आभास

17

मैंने इसे मज़े के लिए करने का फैसला किया, एक अच्छी चुनौती थी। सुनिश्चित नहीं है कि यह सभी मामलों में सही है, इसलिए अपने जोखिम पर उपयोग करें, लेकिन यहां यह है:

function run() {
    const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';
    const newText = reverseText(text);
    console.log(newText);
}

function reverseText(text) {
    // first, create an array of characters
    let textArray = [...text];
    let lastCharConnector = false;
    textArray = textArray.reduce((acc, char, index) => {
        if (char.charCodeAt(0) === 8205) {
            const lastChar = acc[acc.length-1];
            if (Array.isArray(lastChar)) {
                lastChar.push(char);
            } else {
                acc[acc.length-1] = [lastChar, char];
            }
            lastCharConnector = true;
        } else if (lastCharConnector) {
            acc[acc.length-1].push(char);
            lastCharConnector = false;
        } else {
            acc.push(char);
            lastCharConnector = false;
        }
        return acc;
    }, []);
    
    console.log('initial text array', textArray);
    textArray = textArray.reverse();
    console.log('reversed text array', textArray);

    textArray = textArray.map((item) => {
        if (Array.isArray(item)) {
            return item.join('');
        } else {
            return item;
        }
    });

    return textArray.join('');
}

run();


1
खैर, वास्तव में यह लंबा है क्योंकि डिबग इन्फोस है। मैं वास्तव में सराहना करता हूं कि
हाओ वू

1
@AndrewSavinykh कोड-गोल्फ नहीं है, लेकिन अधिक सुरुचिपूर्ण समाधान की तलाश में था। शायद वन-लाइनर पागल पसंद नहीं है, लेकिन याद रखना आसान है। Regex समाधान के रूप में एक बहुत अच्छा एक imho है।
हाओ वू

0

आप उपयोग कर सकते हैं:

yourstring.split('').reverse().join('')

इसे अपनी स्ट्रिंग को सूची में बदलना चाहिए, इसे उल्टा करना चाहिए फिर इसे फिर से एक स्ट्रिंग बनाना चाहिए।


3
क्या आपने प्रश्न पढ़ा है? आपका कोड वास्तव में कोड ओपी प्रश्न में गलत साबित हुआ है।
वाशिंगटन Guedes

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.