这是一个愚蠢的问题,感觉就像一个。但心理障碍现在很糟糕。 :(
我的问题是我有一个只包含数字的数组。我想将该数组用作查找,但是我在数组中查找数字的数字会继续查找该数字的索引中的数组,而不是该数字是否存在< / strong>在数组中。
例如:
var a = [2,4,6,8,10],
b = 2;
if(a[b]){ /* if the number 2 exists in the array a, then do something * }
但是,它会查看位置2( 6 )中的数组值,而不是值2是否在数组中。这是完全合理的,但是(心理障碍)我无法想出一种方法来测试一个数字是否存在于数字数组中...我甚至制作了所有字符串,但它确实输入了强制类型并且问题仍然存在。 / p>
把头发拉出来。请帮忙,谢谢。 :d
答案 0 :(得分:7)
if (a.indexOf(2) >= 0)
注意IE&lt; 9没有indexOf
,所以你需要添加它以防它不存在:
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(searchElement /*, fromIndex */)
{
"use strict";
if (this === void 0 || 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 !== (1 / 0) && n !== -(1 / 0))
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;
};
}
答案 1 :(得分:2)
如果您只想检查数组是否包含某个项,则可以使用nifty按位NOT运算符和.indexOf()
方法:
if( ~a.indexOf(b) ) {
// 2 was found, do domething here
}
使用 shim 或库总是一个好主意,以确保您的Javascript可以使用.indexOf()
等方法。 @SLaks为您提供了来自MDC
.
.indexOf()
示例
简要说明原因:
按位非运算符,否定一个字节内的所有位。对于positiv / negative位也是如此。基本上它将结果“-1”变为“0”。因此,如果没有找到任何内容,我们会在此时拥有falsy
值。如果我们在开始时匹配某些东西并获得“0”的结果,则将其转换为“-1”,这很好,因为它不是假值。任何其他可能的返回值都保证是真实的价值。
答案 2 :(得分:2)
如果您想要本机查找,请使用对象,而不是数组。
var a = {2:0,4:0,6:0,8:0,10:0},
b = 2;
if (b in a) alert "yay!";
请注意,我使用您的数组值作为键。使用0作为值是任意的,使用in
运算符时,将值放在什么值并不重要。
如果您希望能够
,请使用1
或true
if (a[b]) alert "yay!";
但我建议使用in
,因为这既符合意识又容易出错。
编辑:关于你的想法,数组查找会比对象查找更快。试试吧。
console.log('begin building test array and object');
var x = [], y = {};
for (var i=0; i<1000; i++) {
var n = Math.floor(Math.random() * 1000);
x.push( n );
y[n] = true;
}
console.log('finished building test array and object');
var foo = 0;
console.log('begin 1,000,000 array search rounds at ' + new Date());
for (var i=0; i<1000000; i++) {
if (x.indexOf(i % 1000) > -1) foo++;
}
console.log('finished array search rounds at ' + new Date());
console.log('begin 1,000,000 object search rounds at ' + new Date());
for (var i=0; i<1000000; i++) {
if ((i % 1000) in y) foo++;
}
console.log('finished object search rounds at ' + new Date());
答案 3 :(得分:1)
这里似乎需要一个简单的循环,但是 -
你可以没有循环,没有扩展IE, 如果将数组转换为字符串。
var a = [2,4,6,8,10], n = 2;
if(RegExp('\\b'+n+'\\b').test(a.join(','))){
// n is in a
}
答案 4 :(得分:0)
您可以简单地使用.includes()
数组方法:
let a = [2, 4, 6, 8, 10],
b = 2;
if(a.includes(b)) {
// your code goes here...
}