This is a stupid question, it feels like one. But mental block is bad right now. :(
My problem is I have an array consisting only of numbers. I want to use that arra
If you just want to check whether or not an item is contained by an Array, you can make usage of the nifty bitwise NOT operator along with the .indexOf()
method:
if( ~a.indexOf(b) ) {
// 2 was found, do domething here
}
It's always a good idea to use a shim or library to make sure methods like .indexOf()
are available for your Javascript. @SLaks gave you the example for .indexOf()
from MDC.
Short explanation why this works:
The bitwise not operator, negates all bits within a byte. That is also true for the positiv/negative bit. Basically it turns the result "-1" into "0". So, if nothing was found we have a falsy
value which we want to have at this point. If we match something at the very beginning and get a result of "0" its translated into "-1" which is just fine since its not a falsy value. Any other possible return value is guaranteed a truthy value.
A simple loop seems called for here, but-
You can do it without a loop, and without extending IE, if you convert the array to a string.
var a = [2,4,6,8,10], n = 2;
if(RegExp('\\b'+n+'\\b').test(a.join(','))){
// n is in a
}
if (a.indexOf(2) >= 0)
Note that IE < 9 doesn't have indexOf
, so you'll needto add it in case it doesn't exist:
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;
};
}
You can simply use .includes() method of arrays:
let a = [2, 4, 6, 8, 10],
b = 2;
if(a.includes(b)) {
// your code goes here...
}
If you want a native look-up, use an object, not an array.
var a = {2:0,4:0,6:0,8:0,10:0},
b = 2;
if (b in a) alert "yay!";
note that I use your array value as the key. Using 0 as the value is arbitrary, it does not matter what you put as the value when you use the in
operator.
Use 1
or true
if you want to be able to do
if (a[b]) alert "yay!";
but I'd recommend using in
as this is both ideomatic and less error-prone.
EDIT: Regarding your notion that array lookup would be faster than object lookup. Try it.
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());