एक्मास्क्रिप्ट 6
यदि आप ES6 का उपयोग कर रहे हैं, तो आप आइटमों की एक सरणी का निर्माण कर सकते हैं, और उपयोग कर सकते हैं includes
:
['a', 'b', 'c'].includes('b')
इसके कुछ अंतर्निहित लाभ हैं indexOf
क्योंकि यह NaN
सूची की उपस्थिति के लिए ठीक से परीक्षण कर सकता है , और लापता सरणी तत्वों जैसे कि बीच में [1, , 2]
से एक से मिलान कर सकता है undefined
। includes
भी काम करता है पर जावास्क्रिप्ट सरणियों टाइप किया जैसे Uint8Array
।
आप (जैसे आईई या एज के लिए के रूप में) ब्राउज़र समर्थन के बारे में चिंतित हैं, तो आप कर सकते हैं की जाँच Array.includes
CanIUse.Com पर , और यदि आप जिसकी कमी है एक ब्राउज़र या ब्राउज़र संस्करण लक्षित करना चाहते हैं includes
, मेरा सुझाव है polyfill.io polyfilling के लिए।
बिना किसी ऐरे के
आप isInList
निम्नानुसार एक नई संपत्ति जोड़ सकते हैं :
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
फिर इसे इस तरह उपयोग करें:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
आप एक ही काम कर सकते हैं Number.prototype
।
Array.indexOf
यदि आप एक आधुनिक ब्राउज़र का उपयोग कर रहे हैं, तो indexOf
हमेशा काम करता है। हालाँकि, IE8 और पहले के लिए आपको पॉलीफ़िल की आवश्यकता होगी।
यदि indexOf
रिटर्न -1 है, तो आइटम सूची में नहीं है। हालांकि, ध्यान रखें कि यह विधि ठीक से जांच नहीं करेगी NaN
, और जब यह स्पष्ट रूप से मेल खा सकती है undefined
, तो यह अनुपलब्ध तत्व को undefined
सरणी में नहीं मिला सकती है [1, , 2]
।
के लिए indexOf
या includes
IE में Polyfill , या किसी अन्य ब्राउज़र / संस्करण का समर्थन नहीं है
यदि आप ऊपर बताए अनुसार पॉलिफिल.आईओ जैसी सेवा का उपयोग नहीं करना चाहते हैं , तो आप हमेशा अपने स्वयं के स्रोत कोड मानकों-अनुरूप कस्टम पॉलीफिल्स में शामिल कर सकते हैं। उदाहरण के लिए, मोज़िला डेवलपर नेटवर्क के लिए एक है indexOf
।
इस स्थिति में जहां मुझे इंटरनेट एक्सप्लोरर 7 के लिए एक समाधान करना था, मैंने "अपने स्वयं के" indexOf()
फ़ंक्शन के सरल संस्करण को रोल किया, जो मानकों के अनुरूप नहीं है:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
हालाँकि, मुझे नहीं लगता कि Array.prototype
दीर्घकालिक में संशोधन सबसे अच्छा जवाब है। जावास्क्रिप्ट में संशोधन Object
और Array
प्रोटोटाइप गंभीर बग पैदा कर सकते हैं। आपको यह तय करने की आवश्यकता है कि ऐसा करना आपके अपने परिवेश में सुरक्षित है या नहीं। प्राथमिक नोट में यह है कि एक सरणी (जब Array.prototype गुणों को जोड़ा गया है) को पुनरावृत्त करना एक for ... in
कुंजी के रूप में नया फ़ंक्शन नाम लौटाएगा:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
अब आपका कोड काम कर सकता है, लेकिन भविष्य में कोई व्यक्ति किसी तीसरे पक्ष के जावास्क्रिप्ट लाइब्रेरी या प्लगइन को जोड़ता है जो उत्साह से विरासत में मिली चाबियों के खिलाफ रखवाली नहीं करता है, सब कुछ टूट सकता है।
उस टूट-फूट से बचने का पुराना तरीका, गणना के दौरान, प्रत्येक मूल्य की जांच करना है कि क्या वस्तु वास्तव में उसके पास गैर-विरासत वाली संपत्ति के रूप में है if (arr.hasOwnProperty(x))
और केवल उसके साथ काम करती है x
।
नई ES6 तरीका यह अतिरिक्त मुख्य समस्या से बचने के लिए उपयोग करने के लिए है of
के बजाय in
, for (let x of arr)
। हालाँकि, जब तक आप इस बात की गारंटी नहीं दे सकते कि आपके सभी कोड और थर्ड-पार्टी लाइब्रेरी सख्ती से इस पद्धति से चिपके रहते हैं, तब इस प्रश्न के प्रयोजनों के लिए आप संभवतः includes
ऊपर बताए अनुसार उपयोग करना चाहेंगे ।