2012-01-13 44 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;是力这一个无符号转变为正数