wake-up-neo.com

So beheben Sie Array indexOf () in JavaScript für Internet Explorer-Browser

Wenn Sie lange mit JavaScript gearbeitet haben, wissen Sie, dass Internet Explorer die ECMAScript-Funktion für Array.prototype.indexOf () [einschließlich Internet Explorer 8] nicht implementiert. Dies ist kein großes Problem, da Sie die Funktionalität Ihrer Seite mit dem folgenden Code erweitern können.

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;
}

Wann sollte ich das implementieren?

Sollte ich es auf allen meinen Seiten mit der folgenden Prüfung einschließen, die prüft, ob die Prototypfunktion vorhanden ist, und falls nicht, den Array-Prototyp erweitern?

if (!Array.prototype.indexOf) {

    // Implement function here

}

Oder überprüfen Sie den Browser und wenn es sich um Internet Explorer handelt, implementieren Sie ihn einfach?

//Pseudo-code

if (browser == IE Style Browser) {

     // Implement function here

}
294
Bobby Borszich

Mach es so...

if (!Array.prototype.indexOf) {

}

As empfohlene Kompatibilität von MDC .

Im Allgemeinen ist der Browsererkennungscode ein großes Nein-Nein.

213
Josh Stodola

Alternativ können Sie auch die Funktion jQuery 1.2 inArray verwenden, die browserübergreifend funktionieren sollte:

jQuery.inArray( value, array [, fromIndex ] )
141
Moses Lee

Der vollständige Code wäre dann:

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;
    }
}

Eine wirklich gründliche Antwort und Code für diese und andere Array - Funktionen finden Sie unter Stack Overflow question Beheben von JavaScript - Array - Funktionen im Internet Explorer (indexOf, forEach, etc.) = .

77
Luis Perez

Die underscore.js-Bibliothek hat eine indexOf -Funktion, die Sie stattdessen verwenden können:

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

Sie sollten mit if (!Array.prototype.indexOf) prüfen, ob es nicht definiert ist.

Außerdem ist Ihre Implementierung von indexOf nicht korrekt. Sie müssen === Anstelle von == In Ihrer if (this[i] == obj) -Anweisung verwenden, andernfalls wäre [4,"5"].indexOf(5) gemäß Ihrer Implementierung 1, was falsch ist.

Ich empfehle Ihnen die Implementierung auf MDC .

10
Eli Grey

Es gibt eine offizielle Mozilla-Lösung: 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;
        };
    }
})();
9
Will V King

Ich würde dies jedem empfehlen, der nach fehlender Funktionalität sucht:

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

Es bringt den größten Teil der fehlenden ecma5-Funktionalität in ältere Browser :)

5
Josh Mc

für mich geht das.

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;
  };
}
2
Allen Wong

Dies war meine Implementierung. Fügen Sie dies im Wesentlichen vor allen anderen Skripten auf der Seite hinzu. in Ihrem Master für eine globale Lösung für Internet Explorer 8. Ich habe auch die Trim-Funktion hinzugefügt, die in vielen Frameworks verwendet wird.

<!--[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
Glennweb

Mit dem Underscore.js

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

1
sri_bb