2011-10-27 14 views
7

जावास्क्रिप्ट का array.reverse() कैसे काम करता है? क्या यह सरणी के हर तत्व से गुजरता है और स्वैप करता है? यदि हां, तो क्या यह आकार एन की एक सरणी स्वैप करने के लिए ओ (एन) लेता है?जावास्क्रिप्ट का ऐरे रिवर्स

मुझे लगता है कि कारण मैं पूछ रहा हूँ है अगर array.reverse() रूप में एक ही था, क्योंकि मैं सोच रहा था:

for(var i = 0; i < a.length/2; i++) { 
    var holder = a[i]; 
    a[i] = a[a.length - 1 - i]; 
    a[a.length - 1 - i] = holder; 
} 

नोट: क्षमा करें यदि जावास्क्रिप्ट कोड मैं पोस्ट गलत है, यह बहुत देर हो चुकी है अभी है।

संपादित: a.length/2 को फिक्स्ड a.length

+2

यह गलत है क्योंकि सरणी को पूरी तरह से घुमाकर, आप सभी तत्वों को दो बार स्वैप कर देंगे और मूल सरणी पर वापस आ जाएंगे। 'A.length/2' का उपयोग करें (एक तरंगदैर्ध्य का पूर्णांक विभाजन और 2) – xanatos

उत्तर

6

यह कैसे काम करता है इसके पूर्ण विवरण के लिए, read the relevant section of the spec। यहाँ एल्गोरिथ्म है:

  1. Let हे तर्क के रूप में यह मान गुजर ToObject बुला का नतीजा हो।

    1. लेन को "लंबाई" के साथ ओ [[प्राप्त]] आंतरिक विधि को कॉल करने का परिणाम होने दें।
    2. लेन को ToUint32 (लेनवाल) दें।
    3. मध्य में फर्श (लेन/2) होने दें।
    4. , 0.
    5. दोहराएँ हो Letlower जबकि कम ≠ बीच

      1. दें ऊपरी लेन-कम किया जा -1।
      2. ऊपरी पी को ToString (ऊपरी) होने दें।
      3. निचला पी ToString (निचला) होना चाहिए।
      4. निचला वैल्यू को तर्क [लो] के साथ ओ [[प्राप्त]] आंतरिक विधि को कॉल करने का परिणाम होना चाहिए।
      5. ऊपरी वैल्यू को तर्क के ऊपरी भाग के साथ [[प्राप्त]] आंतरिक विधि को कॉल करने का परिणाम होना चाहिए।
      6. निचले एक्स्टिस्ट्स को [[हैसप्रोपर्टी]] ओ के आंतरिक विधि को तर्क निचले पी के साथ कॉल करने का परिणाम बनने दें।
      7. ऊपरी एक्सपिस्ट्स को [[हैस्प्रोपर्टी]] ओ के आंतरिक विधि को तर्क ऊपरी पी के साथ कॉल करने का परिणाम बनने दें।
      8. तो lowerExists सच है और upperExists सच है,

      9. कॉल है तो [[] रखो] तर्क lowerP, upperValue, और सच के साथ हे की आंतरिक विधि।

      10. तर्क [ऊपरी वाल्यू, और सत्य के साथ [[Put]] O की आंतरिक विधि को कॉल करें।
      11. अन्यथा यदि निचले एक्साइस्ट झूठे हैं और ऊपरी एक्सपिक्स सत्य हैं, तो
      12. ओ [[पुट]] ओ के आंतरिक विधि को कम से कम तर्क, ऊपरी वैल्यू और सत्य के साथ कॉल करें।
      13. तर्कों को ऊपरी और सत्य के साथ [[हटाएं]] आंतरिक विधि को कॉल करें।
      14. अन्यथा यदि निचले एक्स्टिस्ट सत्य हैं और ऊपरी एक्सपिक्स गलत हैं, तो
      15. ओ [ओ हटाएं]] ओ के आंतरिक विधि को कॉल करें, तर्क कम और सत्य के साथ।
      16. तर्क [ऊपरी वाल्यू, और सत्य के साथ [[Put]] O की आंतरिक विधि को कॉल करें।
      17. अन्यथा, लोअरएक्सिस्ट और अपरएक्सिस्ट दोनों झूठे हैं
      18. कोई कार्रवाई आवश्यक नहीं है।
      19. कम से कम 1.
    6. वापसी ओ।
2

वास्तविक एल्गोरिथ्म लगभग आप निर्दिष्ट के समान है। बस for लूप को केवल a.length/2 तक पुनरावृत्त करने के लिए बदलें और यह Array.reverse के समान होगा। मैं सादगी के लिए यहां आंतरिक विवरण छोड़ रहा हूं। तो यह

for(var i = 0; i < a.length/2; i++) { 
    var holder = a[i]; 
    a[i] = a[a.length - 1 - i]; 
    a[a.length - 1 - i] = holder; 
} 
संबंधित मुद्दे