如何檢查某個特定元素是否在數組中? 我不想爲此手動編寫循環;相反,我想使用JavaScript內置函數,也許相當於如何確定一個元素是否包含在沒有循環的數組中?
new Array(0,1,2,3,6,9,12,15,18).Contains(5) //return false
new Array(0,1,2,3,6,9,12,15,18).Contains(1) //return true
如何檢查某個特定元素是否在數組中? 我不想爲此手動編寫循環;相反,我想使用JavaScript內置函數,也許相當於如何確定一個元素是否包含在沒有循環的數組中?
new Array(0,1,2,3,6,9,12,15,18).Contains(5) //return false
new Array(0,1,2,3,6,9,12,15,18).Contains(1) //return true
看起來像一個工作,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;
}
JavaScript中沒有這樣的方法。
某些庫(例如jquery的)具有相似的方法,但它們在內部使用的循環。
數組對象確實有一個indexOf功能,將返回-1,如果對象不存在。但是,IE不支持這個功能。
無論如何,你怎麼認爲那場景下找到該項目?它將不得不循環!僅僅因爲內置函數並不意味着它是神奇的。
你也可以寫一個擴展方法,如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
正如@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
啊,有一種不循環的方式,它很簡單,人們不會在箱子外面思考。
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"));
循環媽媽,沒有循環!
+1提的是,它使用一個循環內部。根據我的經驗,我認爲很多人都沒有那樣做,特別是來自Ruby的人。 :) – 2009-07-03 04:52:02
好吧,有一個循環,但是Ruby中的循環,例如,如果它們是本地的而不是它們用Ruby本身編寫的話會更快。例如,特定的檢查將用C語言編寫,運行速度比用Ruby編寫的循環快得多,所以儘管本地方法可能不是神奇的,但它們肯定更快。 JavaScript的內置方法也是如此。 – 2009-07-03 04:57:31
@Andrew諾伊斯:是的,但是當有人說「我想這樣做不使用循環」,這是技術上是不可能的。 ;) – 2009-07-03 05:04:07