在不使用循环的情况下查找数字数组的项目

时间:2011-07-24 21:39:35

标签: javascript arrays numbers

这是一个愚蠢的问题,感觉就像一个。但心理障碍现在很糟糕。 :(

我的问题是我有一个只包含数字的数组。我想将该数组用作查找,但是我在数组中查找数字的数字会继续查找该数字的索引中的数组,而不是该数字是否存在< / 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

5 个答案:

答案 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运算符时,将值放在什么值并不重要。

如果您希望能够

,请使用1true
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...
}