2012-01-13 11 views
6

Nie wiedziałem o złej zgodności crossbrowser array.indexOf(). Ale teraz, kiedy jestem, muszę znaleźć sposób na osiągnięcie tego samego, ale bez użycia poprzedniej metody.Funkcja Crossbrowser "inArray" (bez jQuery)

Próbowałem googling przez chwilę, ale nie znalazłem żadnych przekonujących odpowiedzi. Na razie robię to z pętlami (ale ten jest powolny i jestem pewien, że są lepsze sposoby)

Uwagi uboczne:

  • Nie mogę użyć jQuery lub jakichkolwiek innych bibliotek/ram .
  • To niekoniecznie musi powrócić indeks (a po prostu prawda/fałsz będzie OK)

myślałem, że to nie jest konieczne, aby dzielić mój kod, skoro wszyscy wiedzą, jak sprawdzić tablicę pętli wygląda (plus obniży swoje IQ)

+0

Możesz użyć ['indexOf' shim] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility) dostarczonego przez Mozillę. –

+0

Chcesz dostarczyć 'IE lt 9' z [ES5-shim] (https://github.com/kriskowal/es5-shim) ... –

+0

Pętle nie są wcale złe. [V8 'indexOf' również sprowadza się do jednego.] (Http://www.google.com/codesearch#OAMlx_jo-ck/src/v8/src/array.js&l=1207) – pimvdb

Odpowiedz

6

Oto jak inArray jest zaimplementowana w jQuery:

function inArray(elem, array, i) { 
    var len; 
    if (array) { 
     if (array.indexOf) { 
      return array.indexOf.call(array, elem, i); 
     } 
     len = array.length; 
     i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 
     for (; i < len; i++) { 
      // Skip accessing in sparse arrays 
      if (i in array && array[ i ] === elem) { 
       return i; 
      } 
     } 
    } 
    return -1; 
} 

nie można użyć jQuery, ale dlaczego nie skorzystać z ich realizacji? :-)

Pozdrawiam!

+1

Najbardziej prawdopodobną przyczyną jest to, że jego nauczyciel próbował zmusić go do wymyślenia własnego kodu. – kennebec

+1

@kennebec Jestem moim własnym nauczycielem (studiuję sam i przez hobby) – mithril333221

1

Na razie robię to z pętlami (ale ten jest powolny i jestem pewien, że są lepsze sposoby)

Bez względu na to, co robisz , to będzie na końcu d ay obejmują pętle. Chyba że wymyślisz algorytm O (1) do przeszukiwania tablicy. Nie ma nic złego w używaniu pętli do znalezienia odpowiedniego elementu. Można nawet rozszerzyć wbudowany obiekt tablicy za pomocą tej metody, aby móc go ponownie użyć.

2

Od MDN:

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this == null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n != n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n != 0 && n != Infinity && n != -Infinity) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 

ten sprawdza, czy widzi natywnej implementacji, czy nie wdrożyć go.

Wybitne Quirks:

t.length >>> 0; jest niepodpisany przesunięcie na życie tego celu liczbę dodatnią