इंटरनेट एक्सप्लोरर ब्राउज़रों के लिए जावास्क्रिप्ट में ऐरे इंडेक्सऑफ () को कैसे ठीक करें


295

यदि आपने किसी भी लंबाई पर जावास्क्रिप्ट के साथ काम किया है, तो आप जानते हैं कि Internet Explorer Array.prototype.indexOf () [Internet Explorer 8 सहित] के लिए ECMAScript फ़ंक्शन को लागू नहीं करता है। यह एक बड़ी समस्या नहीं है, क्योंकि आप निम्न कोड के साथ अपने पेज पर कार्यक्षमता बढ़ा सकते हैं।

Array.prototype.indexOf = function(obj, start) {
     for (var i = (start || 0), j = this.length; i < j; i++) {
         if (this[i] === obj) { return i; }
     }
     return -1;
}

मुझे इसे कब लागू करना चाहिए?

क्या मुझे निम्नलिखित चेक के साथ अपने सभी पृष्ठों पर इसे लपेटना चाहिए, जो यह बताता है कि क्या प्रोटोटाइप फ़ंक्शन मौजूद है और यदि नहीं, तो आगे बढ़ें और ऐरे प्रोटोटाइप का विस्तार करें?

if (!Array.prototype.indexOf) {

    // Implement function here

}

या ब्राउज़र की जाँच करें और अगर यह इंटरनेट एक्सप्लोरर है तो बस इसे लागू करें?

//Pseudo-code

if (browser == IE Style Browser) {

     // Implement function here

}

वास्तव Array.prototype.indexOfमें ECMA-262 / ECMAScript का हिस्सा नहीं है। देखें ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf शायद आप सोच रहे हों String.prototype.indexOf...
Crescent Fresh

5
यह एक विस्तार है, मूल मानक का हिस्सा नहीं है। हालाँकि, इसे जावास्क्रिप्ट 1.6 के भाग के रूप में कार्यान्वित किया जाना चाहिए (जो IE करने में विफल रहता है) developer.mozilla.org/en/New_in_JavaScript_1.6
जोश स्टोडोला

1
@ जोश: सिर्फ "आईई ECMAScript फ़ंक्शन को लागू नहीं करता है ..." का उल्लेख कर रहा था
क्रिसेंट फ्रेश

4
आपका कार्यान्वयन Array.indexOfनकारात्मक आरंभिक सूचकांकों को ध्यान में नहीं रखता है। मोज़िला का सुझाव स्टॉप-गैप
इम्प्लीमेंटेशन

3
मैंने "===" का उपयोग करने के लिए प्रश्न को अपडेट किया है, क्योंकि मुझे चिंता है कि लोग इसे "==" के साथ कॉपी करेंगे और यह गलत होगा - इसके अलावा यह ठीक है। देखिए एली ग्रे का जवाब।
joshcomley

जवाबों:


213

इसको ऐसे करो...

if (!Array.prototype.indexOf) {

}

के रूप में MDC से अनुकूलता की सिफारिश की

सामान्य तौर पर, ब्राउजर डिटेक्शन कोड एक बड़ी संख्या है।


मेरे पास प्रश्न को संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन ECMAScript लिंगो को हटाने और उपयुक्त शब्दों को बदलने के लिए स्वतंत्र महसूस करें। धन्यवाद फिर से
बॉबी बोर्स्ज़िक

12
यदि आप इस तरह की पहचान का उपयोग करते हैं तो सावधान रहें। एक अन्य पुस्तकालय इस परीक्षण को लागू करने से पहले इसे लागू कर सकता है, और यह मानकों के अनुरूप नहीं हो सकता है (प्रोटोटाइप ने इसे कुछ समय पहले किया है)। अगर मैं एक शत्रुतापूर्ण वातावरण में काम कर रहा था (बहुत सारे अलग-अलग पुस्तकालयों का उपयोग करके बहुत से अन्य कोडर), तो मैं इनमें से किसी पर भी भरोसा नहीं करूंगा ...
पाब्लो काबेरा

"लिंक्ड" कॉलम ---> वास्तव में आसान है! मुझे यहाँ उत्तर पसंद है: stackoverflow.com/questions/1744310/…
गॉर्डन

क्या इसे हर js फाइल में लपेटना है?
rd22

MDC वास्तव में कौन है?
फेरीबीग जूल

141

वैकल्पिक रूप से, आप jQuery 1.2 inArray फ़ंक्शन का उपयोग कर सकते हैं , जिसे ब्राउज़र में काम करना चाहिए:

jQuery.inArray( value, array [, fromIndex ] )

'IndexOf' मूल कोड (दाएं) है, इसलिए jQuery 'inArray ()' उतनी ही तेजी से होगा, जैसे कि उपलब्ध होने पर मूल का उपयोग करते हैं और जब नहीं भरते हैं?
जर्क

10
ठीक है तो अपनी टिप्पणी (ऊपर) का जवाब देने के लिए, मैंने इसे लागू किया और क्रोम पर यह उतना ही तेज है जब मैं 'इंडेक्सऑफ़ ()' का उपयोग कर रहा था, लेकिन IE 8 में यह बहुत, बहुत धीमा है ... इसलिए कम से कम हम जानते हैं जब वह कर सकता है तो 'inArray ()' मूल का उपयोग करता है।
जर्क

78

पूरा कोड तब होगा:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start) {
         for (var i = (start || 0), j = this.length; i < j; i++) {
             if (this[i] === obj) { return i; }
         }
         return -1;
    }
}

यह वास्तव में पूरी तरह से उत्तर और कोड के साथ ही अन्य सरणी कार्यों के लिए स्टैक ओवरफ्लो प्रश्न की जांच करता है इंटरनेट एक्सप्लोरर (indexOf, forEach, आदि) में जावास्क्रिप्ट ऐरे कार्यों को फिक्स करना


2
सिर्फ पूरी बात करने के लिए धन्यवाद। जब भी मुझे किसी नए प्रोजेक्ट में क्रॉस-प्लेटफ़ॉर्म इंडेक्सऑफ़ की आवश्यकता होती है, तो मैं इस पृष्ठ पर जाता हूं और आपका स्निपेट पूर्ण कोड वाला एकमात्र होता है। :) वे कुछ सेकंड वास्तव में जोड़ते हैं जब कोई इस पृष्ठ को फ़्रीक्वेंट करता है।
dylnmc

16

Underscore.js लाइब्रेरी में एक इंडेक्सऑफ फ़ंक्शन होता है जिसका उपयोग आप इसके बजाय कर सकते हैं:

_.indexOf([1, 2, 3], 2)

4
यह उत्तर सरणी प्रोटोटाइप के साथ खिलवाड़ से बचा जाता है , और यह उपलब्ध होने पर देशी इंडेक्सऑफ को दर्शाता है। मुझें यह पसंद है।
ब्रैड कोच

अगर आप अंडरस्कोर या लॉश को शामिल करने में सक्षम हैं, तो सबसे आसान तरीका है
क्रिसरिच

10

आपको यह जांचना चाहिए कि क्या इसका उपयोग करके परिभाषित नहीं किया गया है if (!Array.prototype.indexOf)

साथ ही, आपका कार्यान्वयन indexOfसही नहीं है। आपको अपने बयान के ===बजाय उपयोग करना होगा , अन्यथा आपके कार्यान्वयन के अनुसार 1 होगा, जो गलत है।==if (this[i] == obj)[4,"5"].indexOf(5)

मैं आपको एमडीसी पर कार्यान्वयन का उपयोग करने की सलाह देता हूं ।


9

मोज़िला आधिकारिक समाधान है: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

(function() {
    /**Array*/
    // Production steps of ECMA-262, Edition 5, 15.4.4.14
    // Reference: http://es5.github.io/#x15.4.4.14
    if (!Array.prototype.indexOf) {
        Array.prototype.indexOf = function(searchElement, fromIndex) {
            var k;
            // 1. Let O be the result of calling ToObject passing
            //    the this value as the argument.
            if (null === this || undefined === this) {
                throw new TypeError('"this" is null or not defined');
            }
            var O = Object(this);
            // 2. Let lenValue be the result of calling the Get
            //    internal method of O with the argument "length".
            // 3. Let len be ToUint32(lenValue).
            var len = O.length >>> 0;
            // 4. If len is 0, return -1.
            if (len === 0) {
                return -1;
            }
            // 5. If argument fromIndex was passed let n be
            //    ToInteger(fromIndex); else let n be 0.
            var n = +fromIndex || 0;
            if (Math.abs(n) === Infinity) {
                n = 0;
            }
            // 6. If n >= len, return -1.
            if (n >= len) {
                return -1;
            }
            // 7. If n >= 0, then Let k be n.
            // 8. Else, n<0, Let k be len - abs(n).
            //    If k is less than 0, then let k be 0.
            k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
            // 9. Repeat, while k < len
            while (k < len) {
                // a. Let Pk be ToString(k).
                //   This is implicit for LHS operands of the in operator
                // b. Let kPresent be the result of calling the
                //    HasProperty internal method of O with argument Pk.
                //   This step can be combined with c
                // c. If kPresent is true, then
                //    i.  Let elementK be the result of calling the Get
                //        internal method of O with the argument ToString(k).
                //   ii.  Let same be the result of applying the
                //        Strict Equality Comparison Algorithm to
                //        searchElement and elementK.
                //  iii.  If same is true, return k.
                if (k in O && O[k] === searchElement) {
                    return k;
                }
                k++;
            }
            return -1;
        };
    }
})();

1
सिर्फ पांडित्यपूर्ण होना लेकिन एमडीएन सिर्फ मोज़िला नहीं है। यह एक समुदाय संचालित परियोजना है जिसमें मोज़िला कर्मचारी शामिल हैं, लेकिन स्वयंसेवक भी हैं, कोई भी इसमें शामिल हो सकता है और योगदान कर सकता है।
16:24 पर ste2425

5

मैं लापता कार्यक्षमता की तलाश में किसी को भी यह सलाह दूंगा:

http://code.google.com/p/ddr-ecma5/

यह पुराने ब्राउज़रों के लिए सबसे अधिक मौजूद ecma5 कार्यक्षमता में लाता है :)


** हालांकि मैं ध्यान दूंगा कि मुझे IE7 में इस परिवाद के साथ समस्याएँ आई हैं।
जोश मैक

2

यह मेरा कार्यान्वयन था। अनिवार्य रूप से, इसे पृष्ठ पर किसी भी अन्य स्क्रिप्ट से पहले जोड़ें। इंटरनेट एक्सप्लोरर 8 के लिए एक वैश्विक समाधान के लिए अपने मास्टर में यानी। मैंने ट्रिम फ़ंक्शन में भी जोड़ा है जो चौखटे के आवंटन में उपयोग किया जाता है।

<!--[if lte IE 8]>
<script>
    if (!Array.prototype.indexOf) {
        Array.prototype.indexOf = function(obj, start) {
            for (var i = (start || 0), j = this.length; i < j; i++) {
                if (this[i] === obj) {
                    return i;
                }
            }
            return -1;
        };
    }

    if(typeof String.prototype.trim !== 'function') {
        String.prototype.trim = function() {
            return this.replace(/^\s+|\s+$/g, '');
        };
    };
</script>
<![endif]-->

2

इससे मेरा काम बनता है।

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/) {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)? Math.ceil(from) : Math.floor(from);
    if (from < 0)
    from += len;

    for (; from < len; from++) {
      if (from in this && this[from] === elt)
        return from;
    }
    return -1;
  };
}

1

अंडरस्कोर के साथ। js

var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.