2009-07-03 27 views

回答

1

看起來像一個工作,jQuery.inArray

inArray: function(elem, array) { 
    for (var i = 0, length = array.length; i < length; i++) 
    // Use === because on IE, window == document 
     if (array[ i ] === elem) 
      return i; 

    return -1; 
} 
1

JavaScript中沒有這樣的方法。

某些庫(例如jquery的)具有相似的方法,但它們在內部使用的循環。

12

數組對象確實有一個indexOf功能,將返回-1,如果對象不存在。但是,IE不支持這個功能。

無論如何,你怎麼認爲那場景下找到該項目?它將不得不循環!僅僅因爲內置函數並不意味着它是神奇的。

+5

+1提的是,它使用一個循環內部。根據我的經驗,我認爲很多人都沒有那樣做,特別是來自Ruby的人。 :) – 2009-07-03 04:52:02

+0

好吧,有一個循環,但是Ruby中的循環,例如,如果它們是本地的而不是它們用Ruby本身編寫的話會更快。例如,特定的檢查將用C語言編寫,運行速度比用Ruby編寫的循環快得多,所以儘管本地方法可能不是神奇的,但它們肯定更快。 JavaScript的內置方法也是如此。 – 2009-07-03 04:57:31

+3

@Andrew諾伊斯:是的,但是當有人說「我想這樣做不使用循環」,這是技術上是不可能的。 ;) – 2009-07-03 05:04:07

4

你也可以寫一個擴展方法,如this thread解釋。

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
    if (this[i] === obj) { 
     return true; 
    } 
    } 
    return false; 
} 
And now you can simply use the following: 

alert([1, 2, 3].contains(2)); // => true 
alert([1, 2, 3].contains('2')); // => false 
2

正如@Josh Stodola表示,的indexOf功能是你所需要的,但被介紹JavaScript 1.6此功能,兼容性您可以使用此實現了Mozilla的團隊,也正是在Firefox中使用的和SpiderMonkey的:

if (!Array.prototype.indexOf) 
{ 
    Array.prototype.indexOf = function(elt /*, from*/) 
    { 
    var len = this.length >>> 0; 

    var from = Number(arguments[1]) || 0; 
    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 
    if (from < 0) 
     from += len; 

    for (; from < len; from++) 
    { 
     if (from in this && 
      this[from] === elt) 
     return from; 
    } 
    return -1; 
    }; 
} 

來源:MDC

1

啊,有一種不循環的方式,它很簡單,人們不會在箱子外面思考。

Array.prototype.contains = function(){  
    var joined = this.join("-~-"); 
    var re = new RegExp("(^|-~-)" + arguments[0] + "($|-~-)"); 
    return joined.match(re) !== null; 
} 

var arr = ["a","b","c","d"]; 
alert(arr.contains("a")); 
alert(arr.contains("b")); 
alert(arr.contains("c")); 
alert(arr.contains("d")); 
alert(arr.contains("e")); 

循環媽媽,沒有循環!

相關問題