JavaScript equivalent of PHP's in_array()

PhpJavascriptPhpjs

Php Problem Overview


Is there a way in JavaScript to compare values from one array and see if it is in another array?

Similar to PHP's in_array function?

Php Solutions


Solution 1 - Php

No, it doesn't have one. For this reason most popular libraries come with one in their utility packages. Check out jQuery's inArray and Prototype's Array.indexOf for examples.

jQuery's implementation of it is as simple as you might expect:

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

If you are dealing with a sane amount of array elements the above will do the trick nicely.

EDIT: Whoops. I didn't even notice you wanted to see if an array was inside another. According to the PHP documentation this is the expected behavior of PHP's in_array:

$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array('p', 'h'), $a)) {
    echo "'ph' was found\n";
}

if (in_array(array('f', 'i'), $a)) {
    echo "'fi' was found\n";
}

if (in_array('o', $a)) {
    echo "'o' was found\n";
}

// Output:
//  'ph' was found
//  'o' was found

The code posted by Chris and Alex does not follow this behavior. Alex's is the official version of Prototype's indexOf, and Chris's is more like PHP's array_intersect. This does what you want:

function arrayCompare(a1, a2) {
    if (a1.length != a2.length) return false;
    var length = a2.length;
    for (var i = 0; i < length; i++) {
        if (a1[i] !== a2[i]) return false;
    }
    return true;
}

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(typeof haystack[i] == 'object') {
            if(arrayCompare(haystack[i], needle)) return true;
        } else {
            if(haystack[i] == needle) return true;
        }
    }
    return false;
}

And this my test of the above on it:

var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
    alert('ph was found');
}
if(inArray(['f','i'], a)) {
    alert('fi was found');
}
if(inArray('o', a)) {
    alert('o was found');
}  
// Results:
//   alerts 'ph' was found
//   alerts 'o' was found

Note that I intentionally did not extend the Array prototype as it is generally a bad idea to do so.

Solution 2 - Php

There is now Array.prototype.includes:

> The includes() method determines whether an array includes a certain > element, returning true or false as appropriate.

var a = [1, 2, 3];
a.includes(2); // true 
a.includes(4); // false

> Syntax

arr.includes(searchElement)
arr.includes(searchElement, fromIndex)

Solution 3 - Php

Array.indexOf was introduced in JavaScript 1.6, but it is not supported in older browsers. Thankfully the chaps over at Mozilla have done all the hard work for you, and provided you with this for compatibility:

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;
  };
}

There are even some handy usage snippets for your scripting pleasure.

Solution 4 - Php

PHP way:

if (in_array('a', ['a', 'b', 'c'])) {
   // do something if true
}

My solution in JS:

if (['a', 'b', 'c'].includes('a')) {
   // do something if true
}

Solution 5 - Php

If the indexes are not in sequence, or if the indexes are not consecutive, the code in the other solutions listed here will break. A solution that would work somewhat better might be:

function in_array(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

And, as a bonus, here's the equivalent to PHP's array_search (for finding the key of the element in the array:

function array_search(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return i;
    }
    return false;
}

Solution 6 - Php

You can simply use the "includes" function as explained in this lesson on w3schools

it looks like

let myArray = ['Kevin', 'Bob', 'Stuart'];
if( myArray.includes('Kevin'))
console.log('Kevin is here');

Solution 7 - Php

There is a project called Locutus, it implements PHP functions in Javascript and in_array() is included, you can use it exactly as you use in PHP.

Examples of use:

in_array('van', myArray);

in_array(1, otherArray, true); // Forcing strict type

Solution 8 - Php

jQuery solution is available, check the ducumentation here: http://api.jquery.com/jquery.inarray/

$.inArray( 10, [ 8, 9, 10, 11 ] );

Solution 9 - Php

var a = [1,2,3,4,5,6,7,8,9];

var isSixInArray = a.filter(function(item){return item==6}).length ? true : false;

var isSixInArray = a.indexOf(6)>=0;

Solution 10 - Php

Solution 11 - Php

If you only want to check if a single value is in an array, then Paolo's code will do the job. If you want to check which values are common to both arrays, then you'll want something like this (using Paolo's inArray function):

function arrayIntersect(a, b) {
    var intersection = [];
    
    for(var i = 0; i < a.length; i++) {
        if(inArray(b, a[i]))
            intersection.push(a[i]);
    }

    return intersection;
}

This wil return an array of values that are in both a and b. (Mathematically, this is an http://en.wikipedia.org/wiki/Intersection_(set_theory)">intersection</a> of the two arrays.)

EDIT: See https://stackoverflow.com/questions/784012/javascript-equivalent-of-phps-inarray/784015#784015">Paolo's Edited Code for the solution to your problem. :)

Solution 12 - Php

If you need all the PHP available parameters, use this:

function in_array(needle, haystack, argStrict) {
    var key = '', strict = !!argStrict;
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    }
    else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }
    return false;
}

Solution 13 - Php

Add this code to you project and use the object-style inArray methods

if (!Array.prototype.inArray) {
    Array.prototype.inArray = function(element) {
        return this.indexOf(element) > -1;
    };
} 
//How it work
var array = ["one", "two", "three"];
//Return true
array.inArray("one");

Solution 14 - Php

With Dojo Toolkit, you would use dojo.indexOf(). See dojo.indexOf for the documentation, and Arrays Made Easy by Bryan Forbes for some examples.

Solution 15 - Php

function in_array(needle, haystack){

	return haystack.indexOf(needle) !== -1;
}
    

Solution 16 - Php

haystack.find(value => value == needle)

where haystack is an array and needle is an element in array. If element not found will be returned undefined else the same element.

Solution 17 - Php

function in_array(what, where) {
    var a=false;
    for (var i=0; i<where.length; i++) {
        if(what == where[i]) {
            a=true;
            break;
        }
    }
    return a;
}

Solution 18 - Php

I found a great jQuery solution here on SO.

var success = $.grep(array_a, function(v,i) {
    return $.inArray(v, array_b) !== -1;
}).length === array_a.length;

I wish someone would post an example of how to do this in underscore.

Solution 19 - Php

An equivalent of in_array with underscore is _.indexOf

Examples:

_.indexOf([3, 5, 8], 10);   // returns -1, not found```

Solution 20 - Php

If you are going to use it in a class, and if you prefer it to be functional (and work in all browsers):

inArray: function(needle, haystack)
{
    var result = false;

    for (var i in haystack) {
        if (haystack[i] === needle) {
            result = true;
            break;
        }
    }

    return result;
}

Hope it helps someone :-)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionroflwaffleView Question on Stackoverflow
Solution 1 - PhpPaolo BergantinoView Answer on Stackoverflow
Solution 2 - PhpalemjerusView Answer on Stackoverflow
Solution 3 - PhpAlex BarrettView Answer on Stackoverflow
Solution 4 - PhpfsevenmView Answer on Stackoverflow
Solution 5 - Phprandom_user_nameView Answer on Stackoverflow
Solution 6 - PhpAbdulRhman KhallilView Answer on Stackoverflow
Solution 7 - PhpMarcio MazzucatoView Answer on Stackoverflow
Solution 8 - PhpArsen K.View Answer on Stackoverflow
Solution 9 - PhpRax WunterView Answer on Stackoverflow
Solution 10 - PhpJacek DziurdzikowskiView Answer on Stackoverflow
Solution 11 - Phpuser94896View Answer on Stackoverflow
Solution 12 - PhpAndres SKView Answer on Stackoverflow
Solution 13 - PhpНикита ОвчинниковView Answer on Stackoverflow
Solution 14 - PhpvoidstateView Answer on Stackoverflow
Solution 15 - PhpcrisswaltView Answer on Stackoverflow
Solution 16 - PhpEmmanuel de Carvalho GarciaView Answer on Stackoverflow
Solution 17 - PhpPriyaView Answer on Stackoverflow
Solution 18 - PhppymarcoView Answer on Stackoverflow
Solution 19 - PhpBogdan DView Answer on Stackoverflow
Solution 20 - PhpMagePartsView Answer on Stackoverflow