जावास्क्रिप्ट में अंतिम विधि क्यों नहीं है? [बन्द है]


124

यह अजीब है कि जावास्क्रिप्ट ऐरे वर्ग किसी सरणी के अंतिम तत्व को पुनः प्राप्त करने के लिए एक अंतिम विधि प्रदान नहीं करता है। मुझे पता है कि समाधान सरल है (Ar [Ar.length-1]), लेकिन, फिर भी, यह बहुत बार उपयोग किया जाता है।

किसी भी गंभीर कारणों से इसे अभी तक शामिल नहीं किया गया है?


39
उन मामलों के लिए जहां आप सरणी को साइड-इफ़ेक्ट के रूप में बदलने में कोई आपत्ति नहीं करते हैं (यानी जहाँ सरणी केवल अस्थायी है), मुहावरा होगा item= array.pop();
बॉब जूल

7
यहाँ उल्लिखित विधियों में से कई के लिए एक प्रदर्शन बेंचमार्क है: jsperf.com/get-last-item-from-array
Web_Designer

5
अच्छा आकाश, कि पर्फ़ पेज देखने के बाद, ऐसा लगता है array[array.length-1]है जिस तरह से तेजी से दूसरों की तुलना में।
जोंडलम

@JondIm लेकिन यदि आप फ़ंक्शन में एक सरणी बनाते हैं, तो आपको इसके लिए स्थानीय नाम का आविष्कार करने की आवश्यकता है (जो कि arr2 जैसे नामों की ओर जाता है), और आपके पास oneliner के बजाय कोड की 2 लाइनें हैं
Danubian Sailor

1
(Ar[Ar.length-1])मेरे लिए 20 गुना बेहतर प्रदर्शन करता है।
इवगेनी सर्गेव

जवाबों:


38

क्योंकि जावास्क्रिप्ट बहुत धीरे-धीरे बदलता है। और ऐसा इसलिए है क्योंकि लोग ब्राउज़र को धीरे-धीरे अपग्रेड करते हैं।

कई जावास्क्रिप्ट पुस्तकालय अपने स्वयं के last()कार्य को लागू करते हैं । एक का उपयोग करें!


20
बहुत कम से कम, आप एक पुस्तकालय का सुझाव देने पर विचार कर सकते हैं जो कार्यान्वयन प्रदान करेगा। उदाहरण के लिए, अंडरस्कोर.जेएस एक अच्छा विकल्प है। देखें documentcloud.github.com/underscore/#last
शॉन लिंच

11
@ सीन - मुझे लगा कि मैं मूल पोस्टर में एक विशेष जावास्क्रिप्ट पुस्तकालय की सिफारिश करने के व्यवसाय से बाहर रहूंगा। Google वेब के सामूहिक राय का आकलन करने के लिए बहुत अच्छा काम करता है कि किस पुस्तकालय का उपयोग करना है। मैं किसी विशेष को क्यों सुझाऊंगा? वास्तव में, आपने अंडरस्कोर की सिफारिश क्यों की है। जेएस, जो पहली नज़र में मुझे बहुत स्वादिष्ट लगते हैं।
त्रिफलक

6
मैं वास्तव में लाइब्रेरी के बाहर फ़ंक्शन को लागू करने के नीचे दिए गए उत्तर को पसंद करता हूं। उस व्यक्ति ने कहा, जैसे कि कोई व्यक्ति Google के माध्यम से इस प्रश्न पर लड़ रहा है, मैं सुझाव दे रहा था कि शीर्ष उत्तर दूसरों को बैक बटन पर भेजने के बजाय समाधान की खोज जारी रखने में मदद करता है।
शॉन लिंच

5
सवाल यह था कि "जावास्क्रिप्ट में निर्मित यह सुविधा क्यों नहीं है" "यह कार्यक्षमता कैसे प्राप्त कर सकता है"। यह सोचने का कोई कारण नहीं है कि मूल लेखक वास्तव में अपने स्वयं के last()फ़ंक्शन को कैसे लिखना चाहता था । सवाल जावास्क्रिप्ट मूल भाषा के विकास की प्रकृति के बारे में था।
त्रिफलक

3
लेकिन अगर @ निखिल जानना चाहता है कि इसे कैसे लागू किया जाए - अंडरस्कोर का एक अद्भुत एनोटेट स्रोत है। अंतिम () का यह कार्यान्वयन काफी मजबूत है, शायद तब इस लेखक की जरूरत है लेकिन एक पुस्तकालय के लिए महान है। documentcloud.github.com/underscore/docs/…
कनेक्ट करें

264

आप ऐसा कुछ कर सकते हैं:

[10, 20, 30, 40].slice(-1)[0]

एक भाषा में जोड़े जा सकने वाले सहायक तरीकों की मात्रा अनंत है। मुझे लगता है कि वे सिर्फ यह एक जोड़ने पर विचार नहीं किया है।


11
"अनन्तता के करीब" के लिए नीचे की ओर परीक्षा दी
त्रिपिटक

11
क्यों? आप जितना चाहें उतना पास पा सकते हैं, कोई सीमा नहीं :)
Gonlvaro González

35
यह एक उत्तर होना चाहिए।
गिआमपोलो रोडोला

7
@UpTheCreek, क्योंकि आपको सरणी को किसी चर में संग्रहीत करने की आवश्यकता नहीं है।
rmobis

5
@ FinelvaroG.Vicario यह संदर्भ की एक सरणी के लिए ठीक है, लेकिन आपके उदाहरण में आप संख्याओं के साथ काम कर रहे हैं। MDN दस्तावेज़ के अनुसार: "स्लाइस की प्रतिलिपि स्ट्रिंग और संख्याओं को नए सरणी में बनाती है। स्ट्रिंग या संख्या में एक सरणी में परिवर्तन दूसरे सरणी को प्रभावित नहीं करता है।" यदि डेवलपर अपने मूल सरणी में अंतिम तत्व के मूल्य के साथ कुछ करने के लिए एक संदर्भ "array.last" प्राप्त करना चाहता है, और सरणी मान स्ट्रिंग या संख्या शाब्दिक होने के लिए होता है, तो यह विधि काम नहीं करेगी।
1nfiniti

82

स्वयं को परिभाषित करना आसान है। यह जावास्क्रिप्ट की शक्ति है।

if(!Array.prototype.last) {
    Array.prototype.last = function() {
        return this[this.length - 1];
    }
}

var arr = [1, 2, 5];
arr.last(); // 5

हालाँकि, यह तृतीय-पक्ष कोड के साथ समस्याएँ पैदा कर सकता है जो (गलत तरीके से) for..inलूप का उपयोग सरणियों पर पुनरावृति करने के लिए करता है ।

हालाँकि, यदि आप ब्राउज़र समर्थन समस्याओं से बाध्य नहीं हैं , तो गुणों को परिभाषित करने के लिए नए ES5 सिंटैक्स का उपयोग करके उस समस्या को हल कर सकते हैं, जिससे फ़ंक्शन को गैर-गणना योग्य बनाया जा सकता है, जैसे:

Object.defineProperty(Array.prototype, 'last', {
    enumerable: false,
    configurable: true,
    get: function() {
        return this[this.length - 1];
    },
    set: undefined
});

var arr = [1, 2, 5];
arr.last; // 5

11
ध्यान दें कि ऐरे के प्रोटोटाइप में गुण जोड़ने से कोड टूट सकता है। for. अर का उपयोग किसी सरणी पर पुनरावृति करने के लिए किया जाता है। एक सरणी को पुनरावृत्त करने के लिए for..in का उपयोग करना बुरा अभ्यास है, लेकिन यह आमतौर पर पर्याप्त है कि एरे के प्रोटोटाइप को बदलना भी खराब अभ्यास है। यदि आपकी स्क्रिप्ट को अन्य अज्ञात कोड के साथ काम करने की आवश्यकता होती है, तो वस्तु, सरणी, स्ट्रिंग, संख्या, बूलियन और दिनांक के प्रोटोटाइप को सामान्य रूप से परिवर्तित नहीं किया जाना चाहिए।
डग नबबिट

7
@ नहीं - टिप के लिए धन्यवाद। मुझे यह उल्लेख करना चाहिए कि ईएस 5 वाक्यविन्यास को झूठेपन के साथ गणना के साथ जोड़ने का कारण for..inसमस्या को हल करने के लिए ठीक था । निश्चित रूप से, हम अभी तक ES5 के व्यापक कार्यान्वयन के साथ नहीं हैं, लेकिन अब यह जानना काफी अच्छा है क्योंकि ब्राउज़र IE9 सहित इसे तेजी से पकड़ रहे हैं।
अनुराग

4
खाली सूचियों के लिए, this.length - 1मूल्यांकन करता है -1, जो कि, क्योंकि यह एक ऋणात्मक संख्या है, एक सरणी गुण के रूप में माना जाता है, तत्व सूचकांक नहीं।
क्लेमाटेशन

26

i = [].concat(loves).pop(); //corn

आइकन कैट को पॉपकॉर्न बहुत पसंद है


15
चेतावनी: यह पूरी सूची की एक प्रति को केवल एक तत्व पॉप करने के लिए बनाता है। समय और स्थान दोनों में संभावित रूप से बहुत बेकार। यह मत करो।
त्रिपिटक

13

एक अन्य विकल्प, खासकर यदि आप पहले से ही अंडरस्कोरजेस का उपयोग कर रहे हैं, तो यह होगा:

_.last([1, 2, 3, 4]); // Will return 4

5
Array.prototype.last = Array.prototype.last || function() {
    var l = this.length;
    return this[l-1];
}

x = [1,2];
alert( x.last() )

[] .Last () के लिए उपयुक्त आउटपुट क्या होना चाहिए? nullया undefined?
अलवारो गोंजालेज

1
संभवतः इसे भाषा के अनुरूप रखने के लिए अपरिभाषित है।
पदक विजेता जूल

null मुझे लगता है- क्योंकि आपके पास एक सरणी है जिसे अच्छी तरह से परिभाषित किया गया है- बस यह कि इसमें कोई मान्य ऑब्जेक्ट नहीं हैं। अपरिभाषित का उपयोग केवल तभी किया जाना चाहिए जब अंतिम 'संपत्ति' को तथाकथित कंटेनर पर परिभाषित नहीं किया गया हो।
निखिल गर्ग

3
गैर-मौजूद गुणों तक पहुँचने के लिए सामान्य होने के नाते this[l-1]आपको सिर्फ लौटाना होगा undefined। व्यक्तिगत रूप से मैं बल्कि जेएस को लौटने के बजाय एक अपवाद फेंक दिया था undefined, लेकिन जेएस गलीचा के नीचे त्रुटियों को स्वीप करना पसंद करते हैं।
बोबोंस

4

यहां आकर खुद इस सवाल का जवाब ढूंढ रहा था। स्लाइस का उत्तर शायद सबसे अच्छा है, लेकिन मैंने आगे बढ़कर केवल एक "अंतिम" फ़ंक्शन बनाया, जो कि प्रचलित प्रोटोटाइप का अभ्यास करने के लिए था, इसलिए मैंने सोचा कि मैं आगे जाऊंगा और इसे साझा करूंगा। यह आपको सरणी के माध्यम से वैकल्पिक रूप से पीछे की ओर गिनने देता है, और कहते हैं, दूसरे से अंतिम या तीसरे से अंतिम आइटम तक खींचने में मदद करता है। यदि आप एक गणना निर्दिष्ट नहीं करते हैं तो यह केवल 1 में चूक करता है और अंतिम आइटम को बाहर निकालता है।

Array.prototype.last = Array.prototype.last || function(count) {
    count = count || 1;
    var length = this.length;
    if (count <= length) {
        return this[length - count];
    } else {
        return null;
    }
};

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.last(); // returns 9
arr.last(4); // returns 6
arr.last(9); // returns 1
arr.last(10); // returns null

जब आप उपयोग करते हैं last(4)या last(9)आप फ़ंक्शन नाम का अर्थ खो देते हैं, अर्थात; last
प्रशान्त श्यामप्रसाद

3

यहां अंतिम तत्वों को टुकड़ा करने का एक और सरल तरीका है

 var tags = [1, 2, 3, "foo", "bar", "foobar", "barfoo"];
 var lastObj = tags.slice(-1);

lastObjअब है ["barfoo"]

पायथन इसी तरह करता है और जब मैंने जेएस का उपयोग करने की कोशिश की तो यह काम कर गया। मैं अनुमान लगा रहा हूं कि स्क्रिप्टिंग भाषाओं में स्ट्रिंग हेरफेर उसी तरह से काम करता है।

इसी तरह, यदि आप एक सरणी में अंतिम दो ऑब्जेक्ट चाहते हैं,

var lastTwoObj = tags.slice(-2)

तुम्हें दे देंगे ["foobar", "barfoo"]और इतने पर।


@Jakub संपादन के लिए धन्यवाद। मुझे महत्वपूर्ण नकारात्मक संकेत याद आया।
प्रशांत

नहीं, lastObjशामिल होंगे ["barfoo"]। किसी भी मामले में, मैं Array.prototype.slice.call(tagsसिर्फ के बजाय क्यों करूंगा tags.slice?


-1

हाँ, या बस:

var arr = [1, 2, 5];
arr.reverse()[0]

यदि आप मूल्य चाहते हैं, और नई सूची नहीं।


10
यकीन नहीं हो रहा है, लेकिन यह बहुत धीमा लगता है
जोनाथन अज़ुले

3
धीमा होने के अलावा इसमें एक बुरा साइड इफेक्ट भी है कि मूल सरणी उलट है।
स्टीफन क्वान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.