2012-01-13 45 views
6

我並不知道array.indexOf()的交叉瀏覽器兼容性不佳。但現在我是,我需要找到一種方法來實現同樣的事情,但不使用以前的方法。Crossbrowser「inArray」函數(不含jQuery)

我嘗試了一段時間的谷歌搜索,但沒有發現真正有說服力的答案。現在,我正與循環做(但這是緩慢的,我相信有更好的方法)

旁註:

  • 我不能使用jQuery或任何其他庫/框架。
  • 它不一定需要返回指數(一個簡單的真/假 會確定)

我認爲這是沒有必要分享我的代碼,因爲大家都知道怎麼陣列循環檢查看起來像(再加上它會降低你的IQ)

+0

您可以使用Mozilla提供的['indexOf' shim](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility)。 – 2012-01-13 20:07:26

+0

你想用[ES5-shim](https://github.com/kriskowal/es5-shim)提供'IE lt 9' ... – 2012-01-13 20:10:07

+0

循環並不糟糕。 [V8的'indexOf'也歸結爲1.](http://www.google.com/codesearch#OAMlx_jo-ck/src/v8/src/array.js&l=1207) – pimvdb 2012-01-13 20:31:44

回答

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 2012-01-13 20:23:55

+1

@kennebec我是我的老師(我自己和愛好學習) – mithril333221 2012-01-13 20:37:58

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;是力這一個無符號轉變爲正數