Javascript 如何在不循环的情况下确定数组中是否包含元素?
如何检查特定元素是否在数组中我不想为此手动编写循环;相反,我想使用一个JavaScript内置函数,可能与Javascript 如何在不循环的情况下确定数组中是否包含元素?,javascript,arrays,Javascript,Arrays,如何检查特定元素是否在数组中我不想为此手动编写循环;相反,我想使用一个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中没有这样的方法 某些库(例如jquery)有类似的方法,但它们在内部使用循环。数组对象确实有一个函数,如果对象不存在,该函数将返
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中没有这样的方法
某些库(例如jquery)有类似的方法,但它们在内部使用循环。数组对象确实有一个函数,如果对象不存在,该函数将返回-1。但是,IE不支持此功能
不管怎样,您认为它将如何在场景下定位该项目?它必须循环!仅仅因为有一个内置函数并不意味着它是神奇的。您还可以编写一个扩展方法,如中所述 正如@said所说,indexOf函数是您所需要的,但是这个函数是在上引入的,为了兼容性,您可以使用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;
};
}
if(!Array.prototype.indexOf)
{
Array.prototype.indexOf=函数(elt/*,from*/)
{
var len=this.length>>>0;
var from=Number(参数[1])| | 0;
from=(from<0)
?数学单元(来自)
:数学。地板(从);
如果(从<0开始)
from+=len;
for(;from
来源:看起来像是
inArray:函数(元素、数组){
for(var i=0,length=array.length;i
啊,有一种方法可以避免循环,而且非常简单,人们只是不跳出框框思考
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"));
圈妈妈,不要圈 您也可以在这里使用indexOf,至少对于支持它的实现是这样的!顺便说一句,我的答案中的链接提供了firefox在数组中内部定位项目的算法(indexOf)。我肯定它会比这个while循环快。@Josh:我怀疑它会快多少。有很多检查来确保正确的参数被传递,等等,所以我不明白为什么会更快@呆头呆脑的:为什么它不能随身携带?源代码就在这里:+1表示它在内部使用循环。以我的经验,我想很多人都不明白,尤其是来自Ruby的人嗯,有一个循环,但是在Ruby中的循环,例如,如果它们是本地的,那么会比在Ruby中编写的更快。例如,特定的检查将用C编写,运行速度比用Ruby编写的循环快得多,因此虽然本机方法可能并不神奇,但它们肯定更快。JavaScript的内置方法也是如此。@Andrew Noyes:是的,但当有人说“我想在不使用循环的情况下完成这项工作”时,从技术上讲是不可能的手工编写的循环必须被解释,这是它们速度变慢的唯一原因。我已经有了一个链接,但是感谢您发布代码!嘿,jQuery.inArray在其gutsI中使用循环编辑了这个,并直接从jQuery源代码添加了inArray函数,仅供参考。可能是真的,但在用户编写的JavaScript代码中没有循环。:)不错,埃里克!不过,这必须表现得非常糟糕。
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;
}
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"));