questions - javascript programs




एक सरणी में अंतिम आइटम प्राप्त करें (20)

अब तक मेरा जावास्क्रिप्ट कोड यहां दिया गया है:

var linkElement = document.getElementById("BackButton");
var loc_array = document.location.href.split('/');
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); 
linkElement.appendChild(newT);

वर्तमान में यह URL से सरणी में अंतिम आइटम को दूसरा लेता है। हालांकि मैं सरणी में अंतिम आइटम के लिए "index.html" होने के लिए एक चेक करना चाहता हूं और यदि ऐसा है, तो तीसरे आइटम को इसके बजाय अंतिम आइटम पर ले जाएं।


"स्वच्छतम" ES6 तरीका (आईएमओ) होगा:

const foo = [1,2,3,4];
const bar = [...foo].pop();

यह पॉप को विचलित करने से बचाता है क्योंकि पॉप ने हमें स्प्रेड ऑपरेटर का उपयोग नहीं किया था। उस ने कहा, मुझे foo.slice(-1)[0] समाधान भी पसंद है।


@chaiguy ने क्या पोस्ट किया है इसका एक छोटा संस्करण:

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

-1 सूचकांक रिटर्न पहले से ही undefined पढ़ना।


Lodash _.last का उपयोग _.last का अंतिम तत्व प्राप्त करता है।

data = [1,2,3]
last = _.last(data)
console.log(last)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


आप Array के प्रोटोटाइप में एक नई संपत्ति गेटटर जोड़ सकते हैं ताकि यह Array सभी उदाहरणों के माध्यम से सुलभ हो सके।

गेटर्स आपको किसी फ़ंक्शन के रिटर्न वैल्यू तक पहुंचने की इजाजत देता है जैसे कि यह किसी संपत्ति का मूल्य था। पाठ्यक्रम के कार्य का वापसी मूल्य सरणी का अंतिम मान है ( this[this.length - 1] )।

अंत में आप इसे ऐसी स्थिति में लपेटते हैं जो जांचता है कि last प्रॉपर्टी अभी भी undefined (किसी अन्य स्क्रिप्ट द्वारा परिभाषित नहीं है जो उस पर भरोसा कर सकता है)।

if(typeof Array.prototype.last === 'undefined') {
    Object.defineProperty(Array.prototype, 'last', {
        get : function() {
            return this[this.length - 1];
        }
    });
}

// Now you can access it like
[1, 2, 3].last;            // => 3
// or
var test = [50, 1000];
alert(test.last);          // Says '1000'

आईई ≤ 8 में काम नहीं करता है।


आप इस पैटर्न का उपयोग कर सकते हैं ...

let [last] = arr.slice(-1);

हालांकि यह अच्छी तरह से पढ़ता है, ध्यान रखें कि यह एक नई सरणी बनाता है, इसलिए यह अन्य समाधानों की तुलना में कम कुशल है लेकिन यह आपके आवेदन की प्रदर्शन बाधा कभी नहीं होगा।


आप यूआरएल से सरणी निकालने के बिना भी इस मुद्दे को प्राप्त कर सकते हैं

यह मेरा विकल्प है

var hasIndex = (document.location.href.search('index.html') === -1) ? doSomething() : doSomethingElse();

!अस्सलाम वालेकुम


एक एनपीएम मॉड्यूल भी है, जो Array.prototype को last में Array.prototype

npm install array-prototype-last --save

प्रयोग

require('array-prototype-last');

[1, 2, 3].last; //=> 3 

[].last; //=> undefined 

एक और ES6 केवल विकल्प Array.find(item, index)=> {...}) का उपयोग करना होगा:

const arr = [1, 2, 3];
const last = arr.find((item, index) => index === arr.length - 1);

थोड़ा व्यावहारिक मूल्य, यह दिखाने के लिए पोस्ट किया गया है कि इंडेक्स आपके फ़िल्टरिंग तर्क के लिए भी उपलब्ध है।


जैसा कि दूसरों द्वारा इंगित किया गया है, दो मुख्य विकल्प हैं:

myArray[myArray.length - 1]
 myArray.slice(-1)[0] 

पूर्व तेज है जबकि उत्तरार्द्ध छोटा है। यदि गति में अंतर कोई मुद्दा नहीं है तो बेहतर बेहतर है। कम कोड का अर्थ टाइपो बनाने के लिए कम कमरा है।

एक महत्वपूर्ण अंतर यह है कि पहली अभिव्यक्ति में आपको सरणी-नाम TWICE टाइप करना होगा। इसलिए यदि आपके सरणी नाम को लंबा होने की आवश्यकता है तो आपके कोड को 1 दृष्टिकोण के साथ ~ 2x लंबा होना चाहिए। आपके पास सरणी नाम को गलत टाइप करने का एक और मौका भी है।


दो विकल्प हैं:

var last = arr[arr.length - 1]

या

var last = arr.slice(-1)[0]

पूर्व तेज है, लेकिन बाद वाला अच्छा दिखता है

http://jsperf.com/slice-vs-length-1-arr


मैं आम तौर पर underscorejs उपयोग करता हूं, इसके साथ आप बस कर सकते हैं

if (_.last(loc_array) === 'index.html'){
  etc...
}

मेरे लिए जो loc_array.slice(-1)[0] से अधिक अर्थपूर्ण है loc_array.slice(-1)[0]


मैं इंडेक्स की तुलना में array.pop() उपयोग array.pop()

while(loc_array.pop()!= "index.html"){
}
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length])));

इस तरह से आप index.html के पिछले तत्व को हमेशा प्राप्त करते हैं (आपके सरणी को एक आइटम के रूप में पृथक index.html प्रदान करना है)। नोट: हालांकि, सरणी से आप अंतिम तत्व खो देंगे।


यदि कोई एक बार में अंतिम तत्व प्राप्त करना चाहता है, तो वह Array#splice() उपयोग कर सकता है:

lastElement = document.location.href.split('/').splice(-1,1);

यहां, विभाजित तत्वों को सरणी में संग्रहीत करने की आवश्यकता नहीं है, और फिर अंतिम तत्व प्राप्त करें। यदि अंतिम तत्व प्राप्त करना एकमात्र उद्देश्य है, तो इसका उपयोग किया जाना चाहिए।

नोट: यह अपने अंतिम तत्व को हटाकर मूल सरणी को बदलता हैsplice(-1,1) को एक pop() फ़ंक्शन के रूप में सोचें जो अंतिम तत्व को पॉप करता है।


यह काम करेगा?

if (loc_array.pop() == "index.html"){
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-3])));
}
else{
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2])));
}

यहां मूल ARRAY पर इसका कोई प्रभाव नहीं होने का तरीका बताया गया है

a = [1,2,5,6,1,874,98,"abc"];
a.length; //returns 8 elements

यदि आप पॉप () का उपयोग करते हैं, तो यह आपके सरणी को संशोधित करेगा

a.pop();  // will return "abc" AND REMOVES IT from the array 
a.length; // returns 7

लेकिन आप इसका उपयोग कर सकते हैं ताकि इसका मूल सरणी पर कोई प्रभाव न हो :

a.slice(-1).pop(); // will return "abc" won't do modify the array 
                   // because slice creates a new array object 
a.length;          // returns 8; no modification and you've got you last element 

व्यक्तिगत रूप से मैं kuporific / kritzikratzi द्वारा जवाब उभारा होगा। यदि आप नेस्टेड सरणी के साथ काम कर रहे हैं तो सरणी [array.length-1] विधि बहुत बदसूरत हो जाती है।

var array = [[1,2,3], [4,5,6], [7,8,9]]
​
array.slice(-1)[0]
​
//instead of 
​
array[array.length-1]
​
//Much easier to read with nested arrays
​
array.slice(-1)[0].slice(-1)[0]
​
//instead of
​
array[array.length-1][array[array.length-1].length-1]

सुनिश्चित नहीं है कि कोई कमी है, लेकिन यह काफी संक्षेप में लगता है:

arr.slice(-1)[0] 

या

arr.slice(-1).pop()

यदि सरणी खाली है तो दोनों undefined होंगे।


jQuery यह अच्छी तरह से हल करता है:

> $([1,2,3]).get(-1)
3
> $([]).get(-1)
undefined

स्लाइस विधि का उपयोग नकारात्मक मानों के साथ करके सरणी के अंतिम आइटम को प्राप्त किया जा सकता है।

आप नीचे इसके बारे में और अधिक पढ़ सकते हैं।

var fileName = loc_array.slice(-1)[0];
if(fileName.toLowerCase() == "index.html")
{
  //your code...
}

पॉप () का उपयोग करके आपकी सरणी बदल जाएगी, जो हमेशा एक अच्छा विचार नहीं है।


if(loc_array[loc_array.length-1] == 'index.html'){
 //do something
}else{
 //something else.
}

यदि आपका सर्वर "index.html" और "inDEX.htML" के लिए एक ही फ़ाइल परोसता है, तो आप इसका उपयोग भी कर सकते हैं: .toLowerCase()

हालांकि, यदि संभव हो तो आप इस सर्वर-पक्ष को करने पर विचार करना चाहेंगे: यह क्लीनर होगा और जेएस के बिना लोगों के लिए काम करेगा।





javascript