/**
* @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;
};
}());
}