2012-01-13 5 views
6

Я не знал о совместимости с плохим кроссбраузером array.indexOf(). Но теперь, когда я есть, мне нужно найти способ добиться того же, но без использования предыдущего метода.Функция кроссбраузера «inArray» (без jQuery)

Я искал какое-то время, но не нашел реальных убедительных ответов. На данный момент, я делаю это с петлями (но это медленно, и я уверен, что есть лучшие способы)

Боковые Примечания:

  • Я не могу использовать JQuery или любые другие библиотеки/рамки ,
  • Это не обязательно должен возвращать индекс (а просто истина/ложь будет нормально)

я подумал, что не стоит делить мой код, так как вы все знаете, как проверка массива цикл выглядит как (плюс это понизит ваш IQ)

+0

Вы можете использовать опцию ['indexOf'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility), предоставленную Mozilla. –

+0

Вы хотите поставить 'IE lt 9' с помощью [ES5-shim] (https://github.com/kriskowal/es5-shim) ... –

+0

Петли неплохие. [V8 'indexOf' также сводится к одному.] (Http://www.google.com/codesearch#OAMlx_jo-ck/src/v8/src/array.js&l=1207) – pimvdb

ответ

6

Вот как inArray реализуется в 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; 
} 

Вы не можете использовать JQuery, но почему не использовать их реализацию? :-)

С уважением!

+1

Скорее всего, причина в том, что его учитель пытался заставить его придумать свой собственный код. – kennebec

+1

@kennebec Я - мой собственный учитель (я учусь сам и хобби) – mithril333221

1

в настоящем время, я делаю это с петлями (но это медленно, и я уверен, что есть лучшие способы)

Независимо от того, что вы делаете , это будет в конце d ay задействовать циклы. Если вы не придумаете алгоритм O (1) для поиска внутри массива. Нет ничего плохого в использовании цикла для поиска соответствующего элемента. Вы можете даже расширить встроенный объект массива с помощью этого метода, чтобы его можно было повторно использовать.

2

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

Это проверяет, если он видит собственную реализацию, если не реализовать.

Заметные Причуды:

t.length >>> 0; является беззнаковым сдвигом для силы этого положительное число

Смежные вопросы