Wednesday, 28 September 2016

Best way to find if an item is in a JavaScript array?





What is the best way to find if an object is in an array?



This is the best way I know:



function include(arr, obj) {
for(var i=0; i if (arr[i] == obj) return true;
}
}


include([1,2,3,4], 3); // true
include([1,2,3,4], 6); // undefined

Answer



As of ECMAScript 2016 you can use includes()



arr.includes(obj);


If you want to support IE or other older browsers:




function include(arr,obj) {
return (arr.indexOf(obj) != -1);
}


EDIT:
This will not work on IE6, 7 or 8 though. The best workaround is to define it yourself if it's not present:





  1. Mozilla's (ECMA-262) version:



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

    }

  2. Daniel James's version:



    if (!Array.prototype.indexOf) {

    Array.prototype.indexOf = function (obj, fromIndex) {
    if (fromIndex == null) {
    fromIndex = 0;
    } else if (fromIndex < 0) {
    fromIndex = Math.max(0, this.length + fromIndex);
    }
    for (var i = fromIndex, j = this.length; i < j; i++) {
    if (this[i] === obj)
    return i;
    }

    return -1;
    };
    }

  3. roosteronacid's version:



    Array.prototype.hasObject = (
    !Array.indexOf ? function (o)
    {
    var l = this.length + 1;

    while (l -= 1)
    {
    if (this[l - 1] === o)
    {
    return true;
    }
    }
    return false;
    } : function (o)
    {

    return (this.indexOf(o) !== -1);
    }
    );


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...