@josecarlosrz/array-helper
Version:
Array helper to have async behavior and some util methods
254 lines (148 loc) • 5.56 kB
JavaScript
const shuffle = require('./shuffle');
class ArrayHelper
{
static async forEach(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
for (let i = 0; i < array.length; i++) {
if (!(i in array))
continue;
await closure.call(thisArg, array[i], i, array);
}
}
static async map(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
const responses = [];
for (let i = 0; i < array.length; i++) {
if (!(i in array))
continue;
responses.push(await closure.call(thisArg, array[i], i, array));
}
return responses;
}
static async filter(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
const newArray = [];
for (let i = 0; i < array.length; i++) {
if (!(i in array))
continue;
if (await closure.call(thisArg, array[i], i, array))
newArray.push(array[i]);
}
return newArray;
}
static async some(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
for (let i = 0; i < array.length; i++) {
if (!(i in array))
continue;
if (await closure.call(thisArg, array[i], i, array))
return true;
}
return false;
}
static async every(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
for (let i = 0; i < array.length; i++) {
if (!(i in array))
continue;
if (!await closure.call(thisArg, array[i], i, array))
return false;
}
return true;
}
static async find(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
for (let i = 0; i < array.length; i++) {
if (await closure.call(thisArg, array[i], i, array))
return array[i];
}
}
static async findIndex(array, closure)
{
let thisArg;
if (arguments.length > 2)
thisArg = arguments[2];
for (let i = 0; i < array.length; i++) {
if (await closure.call(thisArg, array[i], i, array))
return i;
}
return -1;
}
static async reduce(array, closure)
{
let value;
if (arguments.length > 2) {
value = arguments[2];
} else if (array.length > 0) {
value = array[0];
} else {
throw new TypeError('Reduce of empty array with no initial value');
}
for (let i = 0; i < array.length; i++)
value = await closure(value, array[i], i, array);
return value;
}
static async reduceRight(array, closure)
{
let value;
if (arguments.length > 2) {
value = arguments[2];
} else if (array.length > 0) {
value = array[0];
} else {
throw new TypeError('Reduce of empty array with no initial value');
}
for (let i = array.length - 1; i >= 0; i--)
value = await closure(value, array[i], i, array);
return value;
}
static areEqual(a, b)
{
if (a === b)
return true;
if (a === null || b === null)
throw new TypeError('Arguments must be both arrays');
if (a.length !== b.length)
return false;
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i])
return false;
}
return true;
}
static chunk(array, chunks = 2)
{
const chunksArray = [];
for (let i = 0; i < array.length; i += chunks)
chunksArray.push(array.slice(i, i + chunks));
return chunksArray;
}
static unique(array)
{
return array.filter((value, index, that) =>
that.indexOf(value) === index);
}
static shuffle(array)
{
return shuffle(array);
}
}
module.exports = ArrayHelper;