Source: helper/prototype.array.js

/**
 * @namespace Array
 */

/**
 * In Array - Function
 * @param   {(string|Object)} needle       what you are looking for in the Array
 * @param   {boolean}         partialMatch if a partial match suffices
 * @returns {boolean}         if the needle is in the haystack
 */
Array.prototype.in_array = function (needle, partialMatch) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === needle || (partialMatch && needle.match(this[i]))) {
            return true;
        }
    }
    return false;
};

if (typeof Array.prototype.isArray === "undefined") {
    /**
     * Is Array?
     * @returns {boolean} if it is an array and not just an object
     */
    Array.prototype.isArray = function () {
        return Object.prototype.toString.call(this) === '[object Array]';
    };
}

if (typeof Array.prototype.forEach === "undefined") {
    var each = function (callback) {
        var tempArray = this.slice(0);
        for (var i = 0; i < tempArray.length; i++) {
            if (tempArray[i] !== each && !tempArray.hasOwnProperty(tempArray[i])) {
                var action = callback.call(tempArray[i], tempArray[i], i);
                if (action === 'break') {
                    break;
                }
            }
        }
    };

    /**
     * forEach for Arrays
     * @function
     * @param {function} callback the function call for each element
     */
    Array.prototype.forEach = each;
}

if (typeof Array.prototype.getUnique === "undefined") {
    /**
     * Returns an array of unique elements
     * @returns {Array} unique elements in Array
     */
    Array.prototype.getUnique = function () {
        var u = {},
            a = [];
        for (var i = 0, l = this.length; i < l; ++i) {
            if (u.hasOwnProperty(this[i])) {
                continue;
            }
            a.push(this[i]);
            u[this[i]] = 1;
        }
        return a;
    };
}

if (typeof Array.prototype.from === "undefined") {
    /**
     * Returns an array from a collection
     * @returns {Array} from collection
     */
    Array.prototype.from = function () {
        return [].slice.call(this);
    };
}


// From: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
if (!Array.prototype.filter) {

    /**
     * Filter an array usinga function
     * 
     * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
     * 
     * @throws {TypeError} if given fun is not a function
     * @param   {function} fun   function to call
     * @param   {object}   thisp optional object to call the filter on
     * @returns {Array}    the filtered array
     */
    Array.prototype.filter = function (fun) {
        'use strict';

        if (!this) {
            throw new TypeError();
        }

        var objects = Object(this);
        // var len = objects.length >>> 0;
        if (typeof fun !== 'function') {
            throw new TypeError();
        }

        var res = [];
        var thisp = arguments[1];
        for (var i in objects) {
            if (objects.hasOwnProperty(i)) {
                if (fun.call(thisp, objects[i], i, objects)) {
                    res.push(objects[i]);
                }
            }
        }

        return res;
    };
}

if (typeof Array.prototype.indexOf === "undefined") {

    /**
     * Index of an element in the array or -1 if not found
     * @param   {object} val the object or value to look for
     * @returns {number} the index in the array or -1 if not found
     */
    Array.prototype.indexOf = function (val) {
        for (var i = 0, len = this.length, ele; i < len; i++) {
            ele = this[i];
            if (ele === val) {
                return i;
            }
        }
        return -1;
    };
}

// Production steps of ECMA-262, Edition 6, 22.1.2.1
// Still needed for IE 11.
// see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Polyfill
if (typeof Array.from === "undefined") {
  Array.from = (function () {
    var toStr = Object.prototype.toString;
    var isCallable = function (fn) {
      return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
    };
    var toInteger = function (value) {
      var number = Number(value);
      if (isNaN(number)) { return 0; }
      if (number === 0 || !isFinite(number)) { return number; }
      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
    };
    var maxSafeInteger = Math.pow(2, 53) - 1;
    var toLength = function (value) {
      var len = toInteger(value);
      return Math.min(Math.max(len, 0), maxSafeInteger);
    };

    // The length property of the from method is 1.
    return function from(arrayLike/*, mapFn, thisArg */) {
      // 1. Let C be the this value.
      var C = this;

      // 2. Let items be ToObject(arrayLike).
      var items = Object(arrayLike);

      // 3. ReturnIfAbrupt(items).
      if (arrayLike == null) {
        throw new TypeError('Array.from requires an array-like object - not null or undefined');
      }

      // 4. If mapfn is undefined, then let mapping be false.
      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
      var T;
      if (typeof mapFn !== 'undefined') {
        // 5. else
        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
        if (!isCallable(mapFn)) {
          throw new TypeError('Array.from: when provided, the second argument must be a function');
        }

        // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (arguments.length > 2) {
          T = arguments[2];
        }
      }

      // 10. Let lenValue be Get(items, "length").
      // 11. Let len be ToLength(lenValue).
      var len = toLength(items.length);

      // 13. If IsConstructor(C) is true, then
      // 13. a. Let A be the result of calling the [[Construct]] internal method 
      // of C with an argument list containing the single item len.
      // 14. a. Else, Let A be ArrayCreate(len).
      var A = isCallable(C) ? Object(new C(len)) : new Array(len);

      // 16. Let k be 0.
      var k = 0;
      // 17. Repeat, while k < len… (also steps a - h)
      var kValue;
      while (k < len) {
        kValue = items[k];
        if (mapFn) {
          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
        } else {
          A[k] = kValue;
        }
        k += 1;
      }
      // 18. Let putStatus be Put(A, "length", len, true).
      A.length = len;
      // 20. Return A.
      return A;
    };
  }());
}