Crossbrowser“inArray”函数(不带jQuery)

时间:2012-01-13 20:04:47

标签: javascript arrays

我不知道array.indexOf()的错误的crossbrowser兼容性。但是现在,我需要找到一种方法来实现同样的目的,但不使用前面的方法。

我尝试了谷歌搜索一段时间,但没有找到真正有说服力的答案。现在,我正在使用循环(但这很慢,我确信有更好的方法)

旁注:

  • 我不能使用jQuery或任何其他库/框架。
  • 它不一定需要返回索引(简单地为true / false) 会好的)

我认为没有必要分享我的代码,因为你们都知道阵列循环检查是怎样的(加上它会降低你的智商)

3 个答案:

答案 0 :(得分:6)

以下是如何在jQuery中实现inArray:

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 :(得分: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;是一个无符号的强制转换,这是一个正数

答案 2 :(得分:1)

  

现在,我正在使用循环(但这很慢,我相信有更好的方法)

无论你做什么,它都会在一天结束时涉及循环。除非您发明了一种用于在数组内搜索的O(1)算法。使用循环查找相应的元素没有任何问题。您甚至可以使用此方法扩展内置数组对象,以便您可以重复使用它。