Array.prototype.sort() फ़ंक्शन की एक संपत्ति यह है कि यह एक इन-प्लेस सॉर्टिंग एल्गोरिथ्म है, जिसका अर्थ है कि यह सॉर्ट किए जाने वाले ऐरे की एक नई कॉपी नहीं बनाता है, यह बिना किसी अतिरिक्त स्पेस का उपयोग किए ऐरे को सॉर्ट करता है, जिससे यह अधिक कुशल और प्रदर्शनकारी बन जाता है। लेकिन यह विशेषता कभी-कभी एक अजीब स्थिति की ओर ले जाती है।
इसे एक उदाहरण से समझते हैं। मान लीजिए, हमारे पास कुछ स्ट्रिंग लिटरल्स के साथ एक names ऐरे है। हम इस ऐरे के क्रम को बरकरार रखना चाहते हैं और एक और ऐरे चाहते हैं जिसमें names ऐरे के समान तत्व हों लेकिन वर्णानुक्रम में सॉर्टेड हों।
हम ऐसा कुछ कर सकते हैं -
const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj']; let sortedNames = names; sortedNames = sortedNames.sort(); console.log(names); console.log(sortedNames);
लेकिन जैसा कि हम जानते हैं कि जावास्क्रिप्ट में, ऐरे भी ऑब्जेक्ट्स हैं और ऑब्जेक्ट्स को मान के बजाय रेफरेंस द्वारा कॉपी किया जाता है, इसलिए एक ऐरे को सॉर्ट करने का परिणाम दोनों ऐरे के सॉर्ट होने में होता है, जो हम स्पष्ट रूप से नहीं चाहते।
समाधान
1. नई ऐरे इनिशियलाइज़ करते समय slice() का उपयोग करना
उदाहरण
const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj']; let sortedNames = names.slice(); sortedNames = sortedNames.sort(); console.log(names); console.log(sortedNames);
slice() मेथड वास्तव में एक शैलो कॉपी लौटाता है, जिसे उस ऐरे की एक नई ऐरे में कॉपी किया जाता है जिसके साथ इसका उपयोग किया जाता है, यदि कोई आर्गुमेंट प्रदान नहीं किया जाता है तो यह शुरू से अंत तक कॉपी करता है।
यह मेथड बहुत कुशल नहीं है क्योंकि इसमें एक नई ऐरे इनिशियलाइज़ करना शामिल है और यह केवल स्ट्रिंग/नंबर लिटरल्स के ऐरे के साथ प्रभावी है, दूसरा मेथड थोड़ा अधिक कुशल है और ऑब्जेक्ट्स के ऐरे के साथ भी अच्छा काम करता है।
2. JSON.stringify() / JSON.parse() का उपयोग करना
उदाहरण
const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj']; let sortedNames = JSON.parse(JSON.stringify(names)); sortedNames = sortedNames.sort(); console.log(names); console.log(sortedNames);
ऐरे को JSON स्ट्रिंग में बदलना और वापस ऐरे में एक तरह से कंपाइलर को रेफरेंस द्वारा कॉपी नहीं करने के लिए मजबूर करता है।
दोनों मेथड्स के लिए कंसोल में आउटपुट समान होगा -
आउटपुट
[ 'Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj' ] [ 'Anshul', 'Dheeraj', 'Mukesh', 'Rakesh', 'Ram' ]