Novice, Practiced, Mastered

    30-seconds-of-code

    1.2.3 • Public • Published

    Logo

    30 seconds of code

    License npm Downloads npm Version Known Vulnerabilities
    Travis Build Codacy Badge Maintainability js-semistandard-style
    Awesome ProductHunt Gitter chat PRs Welcome

    Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less.

    Sponsored by DigitalOcean

    • Use Ctrl + F or command + F to search for a snippet.
    • Contributions welcome, please read the contribution guide.
    • Snippets are written in ES6, use the Babel transpiler to ensure backwards-compatibility.
    • You can import these snippets into VSCode, by following the instructions found here.
    • You can search, view and copy these snippets from a terminal, using the CLI application from this repo.
    • If you want to follow 30-seconds-of-code on social media, you can find us on Facebook, Instagram and Twitter.

    Related projects

    Package

    ⚠️ NOTICE: A few of our snippets are not yet optimized for production (see disclaimers for individual snippet issues).

    You can find a package with all the snippets on npm.

    # With npm 
    npm install 30-seconds-of-code
     
    # With yarn 
    yarn add 30-seconds-of-code

    CDN link

    Details

    Browser

    <script src="https://unpkg.com/30-seconds-of-code@1/dist/_30s.es5.min.js"></script>
    <script>
      _30s.average(1, 2, 3);
    </script> 

    Node

    // CommonJS
    const _30s = require('30-seconds-of-code');
    _30s.average(1, 2, 3);
     
    // ES Modules
    import _30s from '30-seconds-of-code';
    _30s.average(1, 2, 3);

    Contents

    🔌 Adapter

    View contents

    📚 Array

    View contents

    🌐 Browser

    View contents

    ⏱️ Date

    View contents

    🎛️ Function

    View contents

    ➗ Math

    View contents

    📦 Node

    View contents

    🗃️ Object

    View contents

    📜 String

    View contents

    📃 Type

    View contents

    🔧 Utility

    View contents

    🔌 Adapter

    ary

    Creates a function that accepts up to n arguments, ignoring any additional arguments.

    Call the provided function, fn, with up to n arguments, using Array.prototype.slice(0,n) and the spread operator (...).

    const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
    Examples
    const firstTwoMax = ary(Math.max, 2);
    [[2, 6, 'a'], [8, 4, 6], [10]].map(x => firstTwoMax(...x)); // [6, 8, 10]


    ⬆ Back to top

    call

    Given a key and a set of arguments, call them when given a context. Primarily useful in composition.

    Use a closure to call a stored key with stored arguments.

    const call = (key, ...args) => context => context[key](...args);
    Examples
    Promise.resolve([1, 2, 3])
      .then(call('map', x => 2 * x))
      .then(console.log); // [ 2, 4, 6 ]
    const map = call.bind(null, 'map');
    Promise.resolve([1, 2, 3])
      .then(map(x => 2 * x))
      .then(console.log); // [ 2, 4, 6 ]


    ⬆ Back to top

    collectInto

    Changes a function that accepts an array into a variadic function.

    Given a function, return a closure that collects all inputs into an array-accepting function.

    const collectInto = fn => (...args) => fn(args);
    Examples
    const Pall = collectInto(Promise.all.bind(Promise));
    let p1 = Promise.resolve(1);
    let p2 = Promise.resolve(2);
    let p3 = new Promise(resolve => setTimeout(resolve, 2000, 3));
    Pall(p1, p2, p3).then(console.log); // [1, 2, 3] (after about 2 seconds)


    ⬆ Back to top

    flip

    Flip takes a function as an argument, then makes the first argument the last.

    Return a closure that takes variadic inputs, and splices the last argument to make it the first argument before applying the rest.

    const flip = fn => (first, ...rest) => fn(...rest, first);
    Examples
    let a = { name: 'John Smith' };
    let b = {};
    const mergeFrom = flip(Object.assign);
    let mergePerson = mergeFrom.bind(null, a);
    mergePerson(b); // == b
    = {};
    Object.assign(b, a); // == b


    ⬆ Back to top

    over

    Creates a function that invokes each provided function with the arguments it receives and returns the results.

    Use Array.prototype.map() and Function.prototype.apply() to apply each function to the given arguments.

    const over = (...fns) => (...args) => fns.map(fn => fn.apply(null, args));
    Examples
    const minMax = over(Math.min, Math.max);
    minMax(1, 2, 3, 4, 5); // [1,5]


    ⬆ Back to top

    overArgs

    Creates a function that invokes the provided function with its arguments transformed.

    Use Array.prototype.map() to apply transforms to args in combination with the spread operator (...) to pass the transformed arguments to fn.

    const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val)));
    Examples
    const square = n => n * n;
    const double = n => n * 2;
    const fn = overArgs((x, y) => [x, y], [square, double]);
    fn(9, 3); // [81, 6]


    ⬆ Back to top

    pipeAsyncFunctions

    Performs left-to-right function composition for asynchronous functions.

    Use Array.prototype.reduce() with the spread operator (...) to perform left-to-right function composition using Promise.then(). The functions can return a combination of: simple values, Promise's, or they can be defined as async ones returning through await. All functions must be unary.

    const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg));
    Examples
    const sum = pipeAsyncFunctions(
      x => x + 1,
      x => new Promise(resolve => setTimeout(() => resolve(+ 2), 1000)),
      x => x + 3,
      async x => (await x) + 4
    );
    (async() => {
      console.log(await sum(5)); // 15 (after one second)
    })();


    ⬆ Back to top

    pipeFunctions

    Performs left-to-right function composition.

    Use Array.prototype.reduce() with the spread operator (...) to perform left-to-right function composition. The first (leftmost) function can accept one or more arguments; the remaining functions must be unary.

    const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
    Examples
    const add5 = x => x + 5;
    const multiply = (x, y) => x * y;
    const multiplyAndAdd5 = pipeFunctions(multiply, add5);
    multiplyAndAdd5(5, 2); // 15


    ⬆ Back to top

    promisify

    Converts an asynchronous function to return a promise.

    Use currying to return a function returning a Promise that calls the original function. Use the ...rest operator to pass in all the parameters.

    In Node 8+, you can use util.promisify

    const promisify = func => (...args) =>
      new Promise((resolve, reject) =>
        func(...args, (err, result) => (err ? reject(err) : resolve(result)))
      );
    Examples
    const delay = promisify((d, cb) => setTimeout(cb, d));
    delay(2000).then(() => console.log('Hi!')); // // Promise resolves after 2s


    ⬆ Back to top

    rearg

    Creates a function that invokes the provided function with its arguments arranged according to the specified indexes.

    Use Array.prototype.map() to reorder arguments based on indexes in combination with the spread operator (...) to pass the transformed arguments to fn.

    const rearg = (fn, indexes) => (...args) => fn(...indexes.map(i => args[i]));
    Examples
    var rearged = rearg(
      function(a, b, c) {
        return [a, b, c];
      },
      [2, 0, 1]
    );
    rearged('b', 'c', 'a'); // ['a', 'b', 'c']


    ⬆ Back to top

    spreadOver

    Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function.

    Use closures and the spread operator (...) to map the array of arguments to the inputs of the function.

    const spreadOver = fn => argsArr => fn(...argsArr);
    Examples
    const arrayMax = spreadOver(Math.max);
    arrayMax([1, 2, 3]); // 3


    ⬆ Back to top

    unary

    Creates a function that accepts up to one argument, ignoring any additional arguments.

    Call the provided function, fn, with just the first argument given.

    const unary = fn => val => fn(val);
    Examples
    ['6', '8', '10'].map(unary(parseInt)); // [6, 8, 10]


    ⬆ Back to top


    📚 Array

    all

    Returns true if the provided predicate function returns true for all elements in a collection, false otherwise.

    Use Array.prototype.every() to test if all elements in the collection return true based on fn. Omit the second argument, fn, to use Boolean as a default.

    const all = (arr, fn = Boolean) => arr.every(fn);
    Examples
    all([4, 2, 3], x => x > 1); // true
    all([1, 2, 3]); // true


    ⬆ Back to top

    allEqual

    Check if all elements in an array are equal.

    Use Array.prototype.every() to check if all the elements of the array are the same as the first one.

    const allEqual = arr => arr.every(val => val === arr[0]);
    Examples
    allEqual([1, 2, 3, 4, 5, 6]); // false
    allEqual([1, 1, 1, 1]); // true


    ⬆ Back to top

    any

    Returns true if the provided predicate function returns true for at least one element in a collection, false otherwise.

    Use Array.prototype.some() to test if any elements in the collection return true based on fn. Omit the second argument, fn, to use Boolean as a default.

    const any = (arr, fn = Boolean) => arr.some(fn);
    Examples
    any([0, 1, 2, 0], x => x >= 2); // true
    any([0, 0, 1, 0]); // true


    ⬆ Back to top

    arrayToCSV

    Converts a 2D array to a comma-separated values (CSV) string.

    Use Array.prototype.map() and Array.prototype.join(delimiter) to combine individual 1D arrays (rows) into strings. Use Array.prototype.join('\n') to combine all rows into a CSV string, separating each row with a newline. Omit the second argument, delimiter, to use a default delimiter of ,.

    const arrayToCSV = (arr, delimiter = ',') =>
      arr.map(v => v.map(x => `"${x}"`).join(delimiter)).join('\n');
    Examples
    arrayToCSV([['a', 'b'], ['c', 'd']]); // '"a","b"\n"c","d"'
    arrayToCSV([['a', 'b'], ['c', 'd']], ';'); // '"a";"b"\n"c";"d"'


    ⬆ Back to top

    bifurcate

    Splits values into two groups. If an element in filter is truthy, the corresponding element in the collection belongs to the first group; otherwise, it belongs to the second group.

    Use Array.prototype.reduce() and Array.prototype.push() to add elements to groups, based on filter.

    const bifurcate = (arr, filter) =>
      arr.reduce((acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc), [[], []]);
    Examples
    bifurcate(['beep', 'boop', 'foo', 'bar'], [true, true, false, true]); // [ ['beep', 'boop', 'bar'], ['foo'] ]


    ⬆ Back to top

    bifurcateBy

    Splits values into two groups according to a predicate function, which specifies which group an element in the input collection belongs to. If the predicate function returns a truthy value, the collection element belongs to the first group; otherwise, it belongs to the second group.

    Use Array.prototype.reduce() and Array.prototype.push() to add elements to groups, based on the value returned by fn for each element.

    const bifurcateBy = (arr, fn) =>
      arr.reduce((acc, val, i) => (acc[fn(val, i) ? 0 : 1].push(val), acc), [[], []]);
    Examples
    bifurcateBy(['beep', 'boop', 'foo', 'bar'], x => x[0] === 'b'); // [ ['beep', 'boop', 'bar'], ['foo'] ]


    ⬆ Back to top

    chunk

    Chunks an array into smaller arrays of a specified size.

    Use Array.from() to create a new array, that fits the number of chunks that will be produced. Use Array.prototype.slice() to map each element of the new array to a chunk the length of size. If the original array can't be split evenly, the final chunk will contain the remaining elements.

    const chunk = (arr, size) =>
      Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
        arr.slice(* size, i * size + size)
      );
    Examples
    chunk([1, 2, 3, 4, 5], 2); // [[1,2],[3,4],[5]]


    ⬆ Back to top

    compact

    Removes falsey values from an array.

    Use Array.prototype.filter() to filter out falsey values (false, null, 0, "", undefined, and NaN).

    const compact = arr => arr.filter(Boolean);
    Examples
    compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34]); // [ 1, 2, 3, 'a', 's', 34 ]


    ⬆ Back to top

    countBy

    Groups the elements of an array based on the given function and returns the count of elements in each group.

    Use Array.prototype.map() to map the values of an array to a function or property name. Use Array.prototype.reduce() to create an object, where the keys are produced from the mapped results.

    const countBy = (arr, fn) =>
      arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val) => {
        acc[val] = (acc[val] || 0) + 1;
        return acc;
      }, {});
    Examples
    countBy([6.1, 4.2, 6.3], Math.floor); // {4: 1, 6: 2}
    countBy(['one', 'two', 'three'], 'length'); // {3: 2, 5: 1}


    ⬆ Back to top

    countOccurrences

    Counts the occurrences of a value in an array.

    Use Array.prototype.reduce() to increment a counter each time you encounter the specific value inside the array.

    const countOccurrences = (arr, val) => arr.reduce((a, v) => (=== val ? a + 1 : a), 0);
    Examples
    countOccurrences([1, 1, 2, 1, 2, 3], 1); // 3


    ⬆ Back to top

    deepFlatten

    Deep flattens an array.

    Use recursion. Use Array.prototype.concat() with an empty array ([]) and the spread operator (...) to flatten an array. Recursively flatten each element that is an array.

    const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
    Examples
    deepFlatten([1, [2], [[3], 4], 5]); // [1,2,3,4,5]


    ⬆ Back to top

    difference

    Returns the difference between two arrays.

    Create a Set from b, then use Array.prototype.filter() on a to only keep values not contained in b.

    const difference = (a, b) => {
      const s = new Set(b);
      return a.filter(x => !s.has(x));
    };
    Examples
    difference([1, 2, 3], [1, 2, 4]); // [3]


    ⬆ Back to top

    differenceBy

    Returns the difference between two arrays, after applying the provided function to each array element of both.

    Create a Set by applying fn to each element in b, then use Array.prototype.filter() in combination with fn on a to only keep values not contained in the previously created set.

    const differenceBy = (a, b, fn) => {
      const s = new Set(b.map(fn));
      return a.filter(x => !s.has(fn(x)));
    };
    Examples
    differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); // [1.2]
    differenceBy([{ x: 2 }, { x: 1 }], [{ x: 1 }], v => v.x); // [ { x: 2 } ]


    ⬆ Back to top

    differenceWith

    Filters out all values from an array for which the comparator function does not return true.

    Use Array.prototype.filter() and Array.prototype.findIndex() to find the appropriate values.

    const differenceWith = (arr, val, comp) => arr.filter(a => val.findIndex(b => comp(a, b)) === -1);
    Examples
    differenceWith([1, 1.2, 1.5, 3, 0], [1.9, 3, 0], (a, b) => Math.round(a) === Math.round(b)); // [1, 1.2]


    ⬆ Back to top

    drop

    Returns a new array with n elements removed from the left.

    Use Array.prototype.slice() to slice the remove the specified number of elements from the left.

    const drop = (arr, n = 1) => arr.slice(n);
    Examples
    drop([1, 2, 3]); // [2,3]
    drop([1, 2, 3], 2); // [3]
    drop([1, 2, 3], 42); // []


    ⬆ Back to top

    dropRight

    Returns a new array with n elements removed from the right.

    Use Array.prototype.slice() to slice the remove the specified number of elements from the right.

    const dropRight = (arr, n = 1) => arr.slice(0, -n);
    Examples
    dropRight([1, 2, 3]); // [1,2]
    dropRight([1, 2, 3], 2); // [1]
    dropRight([1, 2, 3], 42); // []


    ⬆ Back to top

    dropRightWhile

    Removes elements from the end of an array until the passed function returns true. Returns the remaining elements in the array.

    Loop through the array, using Array.prototype.slice() to drop the last element of the array until the returned value from the function is true. Returns the remaining elements.

    const dropRightWhile = (arr, func) => {
      while (arr.length > 0 && !func(arr[arr.length - 1])) arr = arr.slice(0, -1);
      return arr;
    };
    Examples
    dropRightWhile([1, 2, 3, 4], n => n < 3); // [1, 2]


    ⬆ Back to top

    dropWhile

    Removes elements in an array until the passed function returns true. Returns the remaining elements in the array.

    Loop through the array, using Array.prototype.slice() to drop the first element of the array until the returned value from the function is true. Returns the remaining elements.

    const dropWhile = (arr, func) => {
      while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
      return arr;
    };
    Examples
    dropWhile([1, 2, 3, 4], n => n >= 3); // [3,4]


    ⬆ Back to top

    everyNth

    Returns every nth element in an array.

    Use Array.prototype.filter() to create a new array that contains every nth element of a given array.

    const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
    Examples
    everyNth([1, 2, 3, 4, 5, 6], 2); // [ 2, 4, 6 ]


    ⬆ Back to top

    filterNonUnique

    Filters out the non-unique values in an array.

    Use Array.prototype.filter() for an array containing only the unique values.

    const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
    Examples
    filterNonUnique([1, 2, 2, 3, 4, 4, 5]); // [1, 3, 5]


    ⬆ Back to top

    filterNonUniqueBy

    Filters out the non-unique values in an array, based on a provided comparator function.

    Use Array.prototype.filter() and Array.prototype.every() for an array containing only the unique values, based on the comparator function, fn. The comparator function takes four arguments: the values of the two elements being compared and their indexes.

    const filterNonUniqueBy = (arr, fn) =>
      arr.filter((v, i) => arr.every((x, j) => (=== j) === fn(v, x, i, j)));
    Examples
    filterNonUniqueBy(
      [
        { id: 0, value: 'a' },
        { id: 1, value: 'b' },
        { id: 2, value: 'c' },
        { id: 1, value: 'd' },
        { id: 0, value: 'e' }
      ],
      (a, b) => a.id == b.id
    ); // [ { id: 2, value: 'c' } ]


    ⬆ Back to top

    findLast

    Returns the last element for which the provided function returns a truthy value.

    Use Array.prototype.filter() to remove elements for which fn returns falsey values, Array.prototype.pop() to get the last one.

    const findLast = (arr, fn) => arr.filter(fn).pop();
    Examples
    findLast([1, 2, 3, 4], n => n % 2 === 1); // 3


    ⬆ Back to top

    findLastIndex

    Returns the index of the last element for which the provided function returns a truthy value.

    Use Array.prototype.map() to map each element to an array with its index and value. Use Array.prototype.filter() to remove elements for which fn returns falsey values, Array.prototype.pop() to get the last one.

    const findLastIndex = (arr, fn) =>
      arr
        .map((val, i) => [i, val])
        .filter(([i, val]) => fn(val, i, arr))
        .pop()[0];
    Examples
    findLastIndex([1, 2, 3, 4], n => n % 2 === 1); // 2 (index of the value 3)


    ⬆ Back to top

    flatten

    Flattens an array up to the specified depth.

    Use recursion, decrementing depth by 1 for each level of depth. Use Array.prototype.reduce() and Array.prototype.concat() to merge elements or arrays. Base case, for depth equal to 1 stops recursion. Omit the second argument, depth to flatten only to a depth of 1 (single flatten).

    const flatten = (arr, depth = 1) =>
      arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), []);
    Examples
    flatten([1, [2], 3, 4]); // [1, 2, 3, 4]
    flatten([1, [2, [3, [4, 5], 6], 7], 8], 2); // [1, 2, 3, [4, 5], 6, 7, 8]


    ⬆ Back to top

    forEachRight

    Executes a provided function once for each array element, starting from the array's last element.

    Use Array.prototype.slice(0) to clone the given array, Array.prototype.reverse() to reverse it and Array.prototype.forEach() to iterate over the reversed array.

    const forEachRight = (arr, callback) =>
      arr
        .slice(0)
        .reverse()
        .forEach(callback);
    Examples
    forEachRight([1, 2, 3, 4], val => console.log(val)); // '4', '3', '2', '1'


    ⬆ Back to top

    groupBy

    Groups the elements of an array based on the given function.

    Use Array.prototype.map() to map the values of an array to a function or property name. Use Array.prototype.reduce() to create an object, where the keys are produced from the mapped results.

    const groupBy = (arr, fn) =>
      arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
        acc[val] = (acc[val] || []).concat(arr[i]);
        return acc;
      }, {});
    Examples
    groupBy([6.1, 4.2, 6.3], Math.floor); // {4: [4.2], 6: [6.1, 6.3]}
    groupBy(['one', 'two', 'three'], 'length'); // {3: ['one', 'two'], 5: ['three']}


    ⬆ Back to top

    head

    Returns the head of a list.

    Use arr[0] to return the first element of the passed array.

    const head = arr => arr[0];
    Examples
    head([1, 2, 3]); // 1


    ⬆ Back to top

    indexOfAll

    Returns all indices of val in an array. If val never occurs, returns [].

    Use Array.prototype.reduce() to loop over elements and store indices for matching elements. Return the array of indices.

    const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);
    Examples
    indexOfAll([1, 2, 3, 1, 2, 3], 1); // [0,3]
    indexOfAll([1, 2, 3], 4); // []


    ⬆ Back to top

    initial

    Returns all the elements of an array except the last one.

    Use arr.slice(0,-1) to return all but the last element of the array.

    const initial = arr => arr.slice(0, -1);
    Examples
    initial([1, 2, 3]); // [1,2]


    ⬆ Back to top

    initialize2DArray

    Initializes a 2D array of given width and height and value.

    Use Array.prototype.map() to generate h rows where each is a new array of size w initialize with value. If the value is not provided, default to null.

    const initialize2DArray = (w, h, val = null) =>
      Array.from({ length: h }).map(() => Array.from({ length: w }).fill(val));
    Examples
    initialize2DArray(2, 2, 0); // [[0,0], [0,0]]


    ⬆ Back to top

    initializeArrayWithRange

    Initializes an array containing the numbers in the specified range where start and end are inclusive with their common difference step.

    Use Array.from() to create an array of the desired length, (end - start + 1)/step, and a map function to fill it with the desired values in the given range. You can omit start to use a default value of 0. You can omit step to use a default value of 1.

    const initializeArrayWithRange = (end, start = 0, step = 1) =>
      Array.from({ length: Math.ceil((end - start + 1) / step) }, (v, i) => i * step + start);
    Examples
    initializeArrayWithRange(5); // [0,1,2,3,4,5]
    initializeArrayWithRange(7, 3); // [3,4,5,6,7]
    initializeArrayWithRange(9, 0, 2); // [0,2,4,6,8]


    ⬆ Back to top

    initializeArrayWithRangeRight

    Initializes an array containing the numbers in the specified range (in reverse) where start and end are inclusive with their common difference step.

    Use Array.from(Math.ceil((end+1-start)/step)) to create an array of the desired length(the amounts of elements is equal to (end-start)/step or (end+1-start)/step for inclusive end), Array.prototype.map() to fill with the desired values in a range. You can omit start to use a default value of 0. You can omit step to use a default value of 1.

    const initializeArrayWithRangeRight = (end, start = 0, step = 1) =>
      Array.from({ length: Math.ceil((end + 1 - start) / step) }).map(
        (v, i, arr) => (arr.length - i - 1) * step + start
      );
    Examples
    initializeArrayWithRangeRight(5); // [5,4,3,2,1,0]
    initializeArrayWithRangeRight(7, 3); // [7,6,5,4,3]
    initializeArrayWithRangeRight(9, 0, 2); // [8,6,4,2,0]


    ⬆ Back to top

    initializeArrayWithValues

    Initializes and fills an array with the specified values.

    Use Array(n) to create an array of the desired length, fill(v) to fill it with the desired values. You can omit val to use a default value of 0.

    const initializeArrayWithValues = (n, val = 0) => Array(n).fill(val);
    Examples
    initializeArrayWithValues(5, 2); // [2, 2, 2, 2, 2]


    ⬆ Back to top

    initializeNDArray

    Create a n-dimensional array with given value.

    Use recursion. Use Array.prototype.map() to generate rows where each is a new array initialized using initializeNDArray.

    const initializeNDArray = (val, ...args) =>
      args.length === 0
        ? val
        : Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1)));
    Examples
    initializeNDArray(1, 3); // [1,1,1]
    initializeNDArray(5, 2, 2, 2); // [[[5,5],[5,5]],[[5,5],[5,5]]]


    ⬆ Back to top

    intersection

    Returns a list of elements that exist in both arrays.

    Create a Set from b, then use Array.prototype.filter() on a to only keep values contained in b.

    const intersection = (a, b) => {
      const s = new Set(b);
      return a.filter(x => s.has(x));
    };
    Examples
    intersection([1, 2, 3], [4, 3, 2]); // [2, 3]


    ⬆ Back to top

    intersectionBy

    Returns a list of elements that exist in both arrays, after applying the provided function to each array element of both.

    Create a Set by applying fn to all elements in b, then use Array.prototype.filter() on a to only keep elements, which produce values contained in b when fn is applied to them.

    const intersectionBy = (a, b, fn) => {
      const s = new Set(b.map(fn));
      return a.filter(x => s.has(fn(x)));
    };
    Examples
    intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); // [2.1]


    ⬆ Back to top

    intersectionWith

    Returns a list of elements that exist in both arrays, using a provided comparator function.

    Use Array.prototype.filter() and Array.prototype.findIndex() in combination with the provided comparator to determine intersecting values.

    const intersectionWith = (a, b, comp) => a.filter(x => b.findIndex(y => comp(x, y)) !== -1);
    Examples
    intersectionWith([1, 1.2, 1.5, 3, 0], [1.9, 3, 0, 3.9], (a, b) => Math.round(a) === Math.round(b)); // [1.5, 3, 0]


    ⬆ Back to top

    isSorted

    Returns 1 if the array is sorted in ascending order, -1 if it is sorted in descending order or 0 if it is not sorted.

    Calculate the ordering direction for the first two elements. Use Object.entries() to loop over array objects and compare them in pairs. Return 0 if the direction changes or the direction if the last element is reached.

    const isSorted = arr => {
      let direction = -(arr[0] - arr[1]);
      for (let [i, val] of arr.entries()) {
        direction = !direction ? -(arr[- 1] - arr[i]) : direction;
        if (=== arr.length - 1) return !direction ? 0 : direction;
        else if ((val - arr[+ 1]) * direction > 0) return 0;
      }
    };
    Examples
    isSorted([0, 1, 2, 2]); // 1
    isSorted([4, 3, 2]); // -1
    isSorted([4, 3, 5]); // 0


    ⬆ Back to top

    join

    Joins all elements of an array into a string and returns this string. Uses a separator and an end separator.

    Use Array.prototype.reduce() to combine elements into a string. Omit the second argument, separator, to use a default separator of ','. Omit the third argument, end, to use the same value as separator by default.

    const join = (arr, separator = ',', end = separator) =>
      arr.reduce(
        (acc, val, i) =>
          i === arr.length - 2
            ? acc + val + end
            : i === arr.length - 1
              ? acc + val
              : acc + val + separator,
        ''
      );
    Examples
    join(['pen', 'pineapple', 'apple', 'pen'], ',', '&'); // "pen,pineapple,apple&pen"
    join(['pen', 'pineapple', 'apple', 'pen'], ','); // "pen,pineapple,apple,pen"
    join(['pen', 'pineapple', 'apple', 'pen']); // "pen,pineapple,apple,pen"


    ⬆ Back to top

    JSONtoCSV advanced

    Converts an array of objects to a comma-separated values (CSV) string that contains only the columns specified.

    Use Array.prototype.join(delimiter) to combine all the names in columns to create the first row. Use Array.prototype.map() and Array.prototype.reduce() to create a row for each object, substituting non-existent values with empty strings and only mapping values in columns. Use Array.prototype.join('\n') to combine all rows into a string. Omit the third argument, delimiter, to use a default delimiter of ,.

    const JSONtoCSV = (arr, columns, delimiter = ',') =>
      [
        columns.join(delimiter),
        ...arr.map(obj =>
          columns.reduce(
            (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
            ''
          )
        )
      ].join('\n');
    Examples
    JSONtoCSV([{ a: 1, b: 2 }, { a: 3, b: 4, c: 5 }, { a: 6 }, { b: 7 }], ['a', 'b']); // 'a,b\n"1","2"\n"3","4"\n"6",""\n"","7"'
    JSONtoCSV([{ a: 1, b: 2 }, { a: 3, b: 4, c: 5 }, { a: 6 }, { b: 7 }], ['a', 'b'], ';'); // 'a;b\n"1";"2"\n"3";"4"\n"6";""\n"";"7"'


    ⬆ Back to top

    last

    Returns the last element in an array.

    Use arr.length - 1 to compute the index of the last element of the given array and returning it.

    const last = arr => arr[arr.length - 1];
    Examples
    last([1, 2, 3]); // 3


    ⬆ Back to top

    longestItem

    Takes any number of iterable objects or objects with a length property and returns the longest one. If multiple objects have the same length, the first one will be returned. Returns undefined if no arguments are provided.

    Use Array.prototype.reduce(), comparing the length of objects to find the longest one.

    const longestItem = (...vals) => vals.reduce((a, x) => (x.length > a.length ? x : a));
    Examples
    longestItem('this', 'is', 'a', 'testcase'); // 'testcase'
    longestItem(...['a', 'ab', 'abc']); // 'abc'
    longestItem(...['a', 'ab', 'abc'], 'abcd'); // 'abcd'
    longestItem([1, 2, 3], [1, 2], [1, 2, 3, 4, 5]); // [1, 2, 3, 4, 5]
    longestItem([1, 2, 3], 'foobar'); // 'foobar'


    ⬆ Back to top

    mapObject advanced

    Maps the values of an array to an object using a function, where the key-value pairs consist of the original value as the key and the mapped value.

    Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new Array to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations).

    const mapObject = (arr, fn) =>
      (a => (
        (= [arr, arr.map(fn)]), a[0].reduce((acc, val, ind) => ((acc[val] = a[1][ind]), acc), {})
      ))();
    Examples
    const squareIt = arr => mapObject(arr, a => a * a);
    squareIt([1, 2, 3]); // { 1: 1, 2: 4, 3: 9 }


    ⬆ Back to top

    maxN

    Returns the n maximum elements from the provided array. If n is greater than or equal to the provided array's length, then return the original array (sorted in descending order).

    Use Array.prototype.sort() combined with the spread operator (...) to create a shallow clone of the array and sort it in descending order. Use Array.prototype.slice() to get the specified number of elements. Omit the second argument, n, to get a one-element array.

    const maxN = (arr, n = 1) => [...arr].sort((a, b) => b - a).slice(0, n);
    Examples
    maxN([1, 2, 3]); // [3]
    maxN([1, 2, 3], 2); // [3,2]


    ⬆ Back to top

    minN

    Returns the n minimum elements from the provided array. If n is greater than or equal to the provided array's length, then return the original array (sorted in ascending order).

    Use Array.prototype.sort() combined with the spread operator (...) to create a shallow clone of the array and sort it in ascending order. Use Array.prototype.slice() to get the specified number of elements. Omit the second argument, n, to get a one-element array.

    const minN = (arr, n = 1) => [...arr].sort((a, b) => a - b).slice(0, n);
    Examples
    minN([1, 2, 3]); // [1]
    minN([1, 2, 3], 2); // [1,2]


    ⬆ Back to top

    none

    Returns true if the provided predicate function returns false for all elements in a collection, false otherwise.

    Use Array.prototype.some() to test if any elements in the collection return true based on fn. Omit the second argument, fn, to use Boolean as a default.

    const none = (arr, fn = Boolean) => !arr.some(fn);
    Examples
    none([0, 1, 3, 0], x => x == 2); // true
    none([0, 0, 0]); // true


    ⬆ Back to top

    nthElement

    Returns the nth element of an array.

    Use Array.prototype.slice() to get an array containing the nth element at the first place. If the index is out of bounds, return undefined. Omit the second argument, n, to get the first element of the array.

    const nthElement = (arr, n = 0) => (=== -1 ? arr.slice(n) : arr.slice(n, n + 1))[0];
    Examples
    nthElement(['a', 'b', 'c'], 1); // 'b'
    nthElement(['a', 'b', 'b'], -3); // 'a'


    ⬆ Back to top

    offset

    Moves the specified amount of elements to the end of the array.

    Use Array.prototype.slice() twice to get the elements after the specified index and the elements before that. Use the spread operator(...) to combine the two into one array. If offset is negative, the elements will be moved from end to start.

    const offset = (arr, offset) => [...arr.slice(offset), ...arr.slice(0, offset)];
    Examples
    offset([1, 2, 3, 4, 5], 2); // [3, 4, 5, 1, 2]
    offset([1, 2, 3, 4, 5], -2); // [4, 5, 1, 2, 3]


    ⬆ Back to top

    partition

    Groups the elements into two arrays, depending on the provided function's truthiness for each element.

    Use Array.prototype.reduce() to create an array of two arrays. Use Array.prototype.push() to add elements for which fn returns true to the first array and elements for which fn returns false to the second one.

    const partition = (arr, fn) =>
      arr.reduce(
        (acc, val, i, arr) => {
          acc[fn(val, i, arr) ? 0 : 1].push(val);
          return acc;
        },
        [[], []]
      );
    Examples
    const users = [{ user: 'barney', age: 36, active: false }, { user: 'fred', age: 40, active: true }];
    partition(users, o => o.active); // [[{ 'user': 'fred',    'age': 40, 'active': true }],[{ 'user': 'barney',  'age': 36, 'active': false }]]


    ⬆ Back to top

    permutations advanced

    ⚠️ WARNING: This function's execution time increases exponentially with each array element. Anything more than 8 to 10 entries will cause your browser to hang as it tries to solve all the different combinations.

    Generates all permutations of an array's elements (contains duplicates).

    Use recursion. For each element in the given array, create all the partial permutations for the rest of its elements. Use Array.prototype.map() to combine the element with each partial permutation, then Array.prototype.reduce() to combine all permutations in one array. Base cases are for array length equal to 2 or 1.

    const permutations = arr => {
      if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
      return arr.reduce(
        (acc, item, i) =>
          acc.concat(
            permutations([...arr.slice(0, i), ...arr.slice(+ 1)]).map(val => [item, ...val])
          ),
        []
      );
    };
    Examples
    permutations([1, 33, 5]); // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ]


    ⬆ Back to top

    pull

    Mutates the original array to filter out the values specified.

    Use Array.prototype.filter() and Array.prototype.includes() to pull out the values that are not needed. Use Array.prototype.length = 0 to mutate the passed in an array by resetting it's length to zero and Array.prototype.push() to re-populate it with only the pulled values.

    (For a snippet that does not mutate the original array see without)

    const pull = (arr, ...args) => {
      let argState = Array.isArray(args[0]) ? args[0] : args;
      let pulled = arr.filter((v, i) => !argState.includes(v));
      arr.length = 0;
      pulled.forEach(v => arr.push(v));
    };
    Examples
    let myArray = ['a', 'b', 'c', 'a', 'b', 'c'];
    pull(myArray, 'a', 'c'); // myArray = [ 'b', 'b' ]


    ⬆ Back to top

    pullAtIndex advanced

    Mutates the original array to filter out the values at the specified indexes.

    Use Array.prototype.filter() and Array.prototype.includes() to pull out the values that are not needed. Use Array.prototype.length = 0 to mutate the passed in an array by resetting it's length to zero and Array.prototype.push() to re-populate it with only the pulled values. Use Array.prototype.push() to keep track of pulled values

    const pullAtIndex = (arr, pullArr) => {
      let removed = [];
      let pulled = arr
        .map((v, i) => (pullArr.includes(i) ? removed.push(v) : v))
        .filter((v, i) => !pullArr.includes(i));
      arr.length = 0;
      pulled.forEach(v => arr.push(v));
      return removed;
    };
    Examples
    let myArray = ['a', 'b', 'c', 'd'];
    let pulled = pullAtIndex(myArray, [1, 3]); // myArray = [ 'a', 'c' ] , pulled = [ 'b', 'd' ]


    ⬆ Back to top

    pullAtValue advanced

    Mutates the original array to filter out the values specified. Returns the removed elements.

    Use Array.prototype.filter() and Array.prototype.includes() to pull out the values that are not needed. Use Array.prototype.length = 0 to mutate the passed in an array by resetting it's length to zero and Array.prototype.push() to re-populate it with only the pulled values. Use Array.prototype.push() to keep track of pulled values

    const pullAtValue = (arr, pullArr) => {
      let removed = [],
        pushToRemove = arr.forEach((v, i) => (pullArr.includes(v) ? removed.push(v) : v)),
        mutateTo = arr.filter((v, i) => !pullArr.includes(v));
      arr.length = 0;
      mutateTo.forEach(v => arr.push(v));
      return removed;
    };
    Examples
    let myArray = ['a', 'b', 'c', 'd'];
    let pulled = pullAtValue(myArray, ['b', 'd']); // myArray = [ 'a', 'c' ] , pulled = [ 'b', 'd' ]


    ⬆ Back to top

    pullBy advanced

    Mutates the original array to filter out the values specified, based on a given iterator function.

    Check if the last argument provided in a function. Use Array.prototype.map() to apply the iterator function fn to all array elements. Use Array.prototype.filter() and Array.prototype.includes() to pull out the values that are not needed. Use Array.prototype.length = 0 to mutate the passed in an array by resetting it's length to zero and Array.prototype.push() to re-populate it with only the pulled values.

    const pullBy = (arr, ...args) => {
      const length = args.length;
      let fn = length > 1 ? args[length - 1] : undefined;
      fn = typeof fn == 'function' ? (args.pop(), fn) : undefined;
      let argState = (Array.isArray(args[0]) ? args[0] : args).map(val => fn(val));
      let pulled = arr.filter((v, i) => !argState.includes(fn(v)));
      arr.length = 0;
      pulled.forEach(v => arr.push(v));
    };
    Examples
    var myArray = [{ x: 1 }, { x: 2 }, { x: 3 }, { x: 1 }];
    pullBy(myArray, [{ x: 1 }, { x: 3 }], o => o.x); // myArray = [{ x: 2 }]


    ⬆ Back to top

    reducedFilter

    Filter an array of objects based on a condition while also filtering out unspecified keys.

    Use Array.prototype.filter() to filter the array based on the predicate fn so that it returns the objects for which the condition returned a truthy value. On the filtered array, use Array.prototype.map() to return the new object using Array.prototype.reduce() to filter out the keys which were not supplied as the keys argument.

    const reducedFilter = (data, keys, fn) =>
      data.filter(fn).map(el =>
        keys.reduce((acc, key) => {
          acc[key] = el[key];
          return acc;
        }, {})
      );
    Examples
    const data = [
      {
        id: 1,
        name: 'john',
        age: 24
      },
      {
        id: 2,
        name: 'mike',
        age: 50
      }
    ];
     
    reducedFilter(data, ['id', 'name'], item => item.age > 24); // [{ id: 2, name: 'mike'}]


    ⬆ Back to top

    reduceSuccessive

    Applies a function against an accumulator and each element in the array (from left to right), returning an array of successively reduced values.

    Use Array.prototype.reduce() to apply the given function to the given array, storing each new result.

    const reduceSuccessive = (arr, fn, acc) =>
      arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]);
    Examples
    reduceSuccessive([1, 2, 3, 4, 5, 6], (acc, val) => acc + val, 0); // [0, 1, 3, 6, 10, 15, 21]


    ⬆ Back to top

    reduceWhich

    Returns the minimum/maximum value of an array, after applying the provided function to set comparing rule.

    Use Array.prototype.reduce() in combination with the comparator function to get the appropriate element in the array. You can omit the second parameter, comparator, to use the default one that returns the minimum element in the array.

    const reduceWhich = (arr, comparator = (a, b) => a - b) =>
      arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a));
    Examples
    reduceWhich([1, 3, 2]); // 1
    reduceWhich([1, 3, 2], (a, b) => b - a); // 3
    reduceWhich(
      [{ name: 'Tom', age: 12 }, { name: 'Jack', age: 18 }, { name: 'Lucy', age: 9 }],
      (a, b) => a.age - b.age
    ); // {name: "Lucy", age: 9}


    ⬆ Back to top

    reject

    Takes a predicate and array, like Array.prototype.filter(), but only keeps x if pred(x) === false.

    const reject = (pred, array) => array.filter((...args) => !pred(...args));
    Examples
    reject(x => x % 2 === 0, [1, 2, 3, 4, 5]); // [1, 3, 5]
    reject(word => word.length > 4, ['Apple', 'Pear', 'Kiwi', 'Banana']); // ['Pear', 'Kiwi']


    ⬆ Back to top

    remove

    Removes elements from an array for which the given function returns false.

    Use Array.prototype.filter() to find array elements that return truthy values and Array.prototype.reduce() to remove elements using Array.prototype.splice(). The func is invoked with three arguments (value, index, array).

    const remove = (arr, func) =>
      Array.isArray(arr)
        ? arr.filter(func).reduce((acc, val) => {
          arr.splice(arr.indexOf(val), 1);
          return acc.concat(val);
        }, [])
        : [];
    Examples
    remove([1, 2, 3, 4], n => n % 2 === 0); // [2, 4]


    ⬆ Back to top

    sample

    Returns a random element from an array.

    Use Math.random() to generate a random number, multiply it by length and round it off to the nearest whole number using Math.floor(). This method also works with strings.

    const sample = arr => arr[Math.floor(Math.random() * arr.length)];
    Examples
    sample([3, 7, 9, 11]); // 9


    ⬆ Back to top

    sampleSize

    Gets n random elements at unique keys from array up to the size of array.

    Shuffle the array using the Fisher-Yates algorithm. Use Array.prototype.slice() to get the first n elements. Omit the second argument, n to get only one element at random from the array.

    const sampleSize = ([...arr], n = 1) => {
      let m = arr.length;
      while (m) {
        const i = Math.floor(Math.random() * m--);
        [arr[m], arr[i]] = [arr[i], arr[m]];
      }
      return arr.slice(0, n);
    };
    Examples
    sampleSize([1, 2, 3], 2); // [3,1]
    sampleSize([1, 2, 3], 4); // [2,3,1]


    ⬆ Back to top

    shank

    Has the same functionality as Array.prototype.splice(), but returning a new array instead of mutating the original array.

    Use Array.prototype.slice() and Array.prototype.concat() to get a new array with the new contents after removing existing elements and/or adding new elements. Omit the second argument, index, to start at 0. Omit the third argument, delCount, to remove 0 elements. Omit the fourth argument, elements, in order to not add any new elements.

    const shank = (arr, index = 0, delCount = 0, ...elements) =>
      arr
        .slice(0, index)
        .concat(elements)
        .concat(arr.slice(index + delCount));
    Examples
    const names = ['alpha', 'bravo', 'charlie'];
    const namesAndDelta = shank(names, 1, 0, 'delta'); // [ 'alpha', 'delta', 'bravo', 'charlie' ]
    const namesNoBravo = shank(names, 1, 1); // [ 'alpha', 'charlie' ]
    console.log(names); // ['alpha', 'bravo', 'charlie']


    ⬆ Back to top

    shuffle

    Randomizes the order of the values of an array, returning a new array.

    Uses the Fisher-Yates algorithm to reorder the elements of the array.

    const shuffle = ([...arr]) => {
      let m = arr.length;
      while (m) {
        const i = Math.floor(Math.random() * m--);
        [arr[m], arr[i]] = [arr[i], arr[m]];
      }
      return arr;
    };
    Examples
    const foo = [1, 2, 3];
    shuffle(foo); // [2, 3, 1], foo = [1, 2, 3]


    ⬆ Back to top

    similarity

    Returns an array of elements that appear in both arrays.

    Use Array.prototype.filter() to remove values that are not part of values, determined using Array.prototype.includes().

    const similarity = (arr, values) => arr.filter(v => values.includes(v));
    Examples
    similarity([1, 2, 3], [1, 2, 4]); // [1, 2]


    ⬆ Back to top

    sortedIndex

    Returns the lowest index at which value should be inserted into array in order to maintain its sort order.

    Check if the array is sorted in descending order (loosely). Use Array.prototype.findIndex() to find the appropriate index where the element should be inserted.

    const sortedIndex = (arr, n) => {
      const isDescending = arr[0] > arr[arr.length - 1];
      const index = arr.findIndex(el => (isDescending ? n >= el : n <= el));
      return index === -1 ? arr.length : index;
    };
    Examples
    sortedIndex([5, 3, 2, 1], 4); // 1
    sortedIndex([30, 50], 40); // 1


    ⬆ Back to top

    sortedIndexBy

    Returns the lowest index at which value should be inserted into array in order to maintain its sort order, based on a provided iterator function.

    Check if the array is sorted in descending order (loosely). Use Array.prototype.findIndex() to find the appropriate index where the element should be inserted, based on the iterator function fn.

    const sortedIndexBy = (arr, n, fn) => {
      const isDescending = fn(arr[0]) > fn(arr[arr.length - 1]);
      const val = fn(n);
      const index = arr.findIndex(el => (isDescending ? val >= fn(el) : val <= fn(el)));
      return index === -1 ? arr.length : index;
    };
    Examples
    sortedIndexBy([{ x: 4 }, { x: 5 }], { x: 4 }, o => o.x); // 0


    ⬆ Back to top

    sortedLastIndex

    Returns the highest index at which value should be inserted into array in order to maintain its sort order.

    Check if the array is sorted in descending order (loosely). Use Array.prototype.reverse() and Array.prototype.findIndex() to find the appropriate last index where the element should be inserted.

    const sortedLastIndex = (arr, n) => {
      const isDescending = arr[0] > arr[arr.length - 1];
      const index = arr.reverse().findIndex(el => (isDescending ? n <= el : n >= el));
      return index === -1 ? 0 : arr.length - index;
    };
    Examples
    sortedLastIndex([10, 20, 30, 30, 40], 30); // 4


    ⬆ Back to top

    sortedLastIndexBy

    Returns the highest index at which value should be inserted into array in order to maintain its sort order, based on a provided iterator function.

    Check if the array is sorted in descending order (loosely). Use Array.prototype.map() to apply the iterator function to all elements of the array. Use Array.prototype.reverse() and Array.prototype.findIndex() to find the appropriate last index where the element should be inserted, based on the provided iterator function.

    const sortedLastIndexBy = (arr, n, fn) => {
      const isDescending = fn(arr[0]) > fn(arr[arr.length - 1]);
      const val = fn(n);
      const index = arr
        .map(fn)
        .reverse()
        .findIndex(el => (isDescending ? val <= el : val >= el));
      return index === -1 ? 0 : arr.length - index;
    };
    Examples
    sortedLastIndexBy([{ x: 4 }, { x: 5 }], { x: 4 }, o => o.x); // 1


    ⬆ Back to top

    stableSort advanced

    Performs stable sorting of an array, preserving the initial indexes of items when their values are the same. Does not mutate the original array, but returns a new array instead.

    Use Array.prototype.map() to pair each element of the input array with its corresponding index. Use Array.prototype.sort() and a compare function to sort the list, preserving their initial order if the items compared are equal. Use Array.prototype.map() to convert back to the initial array items.

    const stableSort = (arr, compare) =>
      arr
        .map((item, index) => ({ item, index }))
        .sort((a, b) => compare(a.item, b.item) || a.index - b.index)
        .map(({ item }) => item);
    Examples
    const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    const stable = stableSort(arr, () => 0); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


    ⬆ Back to top

    symmetricDifference

    Returns the symmetric difference between two arrays, without filtering out duplicate values.

    Create a Set from each array, then use Array.prototype.filter() on each of them to only keep values not contained in the other.

    const symmetricDifference = (a, b) => {
      const sA = new Set(a),
        sB = new Set(b);
      return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
    };
    Examples
    symmetricDifference([1, 2, 3], [1, 2, 4]); // [3, 4]
    symmetricDifference([1, 2, 2], [1, 3, 1]); // [2, 2, 3]


    ⬆ Back to top

    symmetricDifferenceBy

    Returns the symmetric difference between two arrays, after applying the provided function to each array element of both.

    Create a Set by applying fn to each array's elements, then use Array.prototype.filter() on each of them to only keep values not contained in the other.

    const symmetricDifferenceBy = (a, b, fn) => {
      const sA = new Set(a.map(v => fn(v))),
        sB = new Set(b.map(v => fn(v)));
      return [...a.filter(x => !sB.has(fn(x))), ...b.filter(x => !sA.has(fn(x)))];
    };
    Examples
    symmetricDifferenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); // [ 1.2, 3.4 ]


    ⬆ Back to top

    symmetricDifferenceWith

    Returns the symmetric difference between two arrays, using a provided function as a comparator.

    Use Array.prototype.filter() and Array.prototype.findIndex() to find the appropriate values.

    const symmetricDifferenceWith = (arr, val, comp) => [
      ...arr.filter(a => val.findIndex(b => comp(a, b)) === -1),
      ...val.filter(a => arr.findIndex(b => comp(a, b)) === -1)
    ];
    Examples
    symmetricDifferenceWith(
      [1, 1.2, 1.5, 3, 0],
      [1.9, 3, 0, 3.9],
      (a, b) => Math.round(a) === Math.round(b)
    ); // [1, 1.2, 3.9]


    ⬆ Back to top

    tail

    Returns all elements in an array except for the first one.

    Return Array.prototype.slice(1) if the array's length is more than 1, otherwise, return the whole array.

    const tail = arr => (arr.length > 1 ? arr.slice(1) : arr);
    Examples
    tail([1, 2, 3]); // [2,3]
    tail([1]); // [1]


    ⬆ Back to top

    take

    Returns an array with n elements removed from the beginning.

    Use Array.prototype.slice() to create a slice of the array with n elements taken from the beginning.

    const take = (arr, n = 1) => arr.slice(0, n);
    Examples
    take([1, 2, 3], 5); // [1, 2, 3]
    take([1, 2, 3], 0); // []


    ⬆ Back to top

    takeRight

    Returns an array with n elements removed from the end.

    Use Array.prototype.slice() to create a slice of the array with n elements taken from the end.

    const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
    Examples
    takeRight([1, 2, 3], 2); // [ 2, 3 ]
    takeRight([1, 2, 3]); // [3]


    ⬆ Back to top

    takeRightWhile

    Removes elements from the end of an array until the passed function returns true. Returns the removed elements.

    Loop through the array, using a Array.prototype.reduceRight() and accumulating elements while the function returns falsy value.

    const takeRightWhile = (arr, func) =>
      arr.reduceRight((acc, el) => (func(el) ? acc : [el, ...acc]), []);
    Examples
    takeRightWhile([1, 2, 3, 4], n => n < 3); // [3, 4]


    ⬆ Back to top

    takeWhile

    Removes elements in an array until the passed function returns true. Returns the removed elements.

    Loop through the array, using a for...of loop over Array.prototype.entries() until the returned value from the function is true. Return the removed elements, using Array.prototype.slice().

    const takeWhile = (arr, func) => {
      for (const [i, val] of arr.entries()) if (func(val)) return arr.slice(0, i);
      return arr;
    };
    Examples
    takeWhile([1, 2, 3, 4], n => n >= 3); // [1, 2]


    ⬆ Back to top

    toHash

    Reduces a given Array-like into a value hash (keyed data store).

    Given an Iterable or Array-like structure, call Array.prototype.reduce.call() on the provided object to step over it and return an Object, keyed by the reference value.

    const toHash = (object, key) =>
      Array.prototype.reduce.call(
        object,
        (acc, data, index) => ((acc[!key ? index : data[key]] = data), acc),
        {}
      );
    Examples
    toHash([4, 3, 2, 1]); // { 0: 4, 1: 3, 2: 2, 3: 1 }
    toHash([{ a: 'label' }], 'a'); // { label: { a: 'label' } }
    // A more in depth example:
    let users = [{ id: 1, first: 'Jon' }, { id: 2, first: 'Joe' }, { id: 3, first: 'Moe' }];
    let managers = [{ manager: 1, employees: [2, 3] }];
    // We use function here because we want a bindable reference, but a closure referencing the hash would work, too.
    managers.forEach(
      manager =>
        (manager.employees = manager.employees.map(function(id) {
          return this[id];
        }, toHash(users, 'id')))
    );
    managers; // [ { manager:1, employees: [ { id: 2, first: "Joe" }, { id: 3, first: "Moe" } ] } ]


    ⬆ Back to top

    union

    Returns every element that exists in any of the two arrays once.

    Create a Set with all values of a and b and convert to an array.

    const union = (a, b) => Array.from(new Set([...a, ...b]));
    Examples
    union([1, 2, 3], [4, 3, 2]); // [1,2,3,4]


    ⬆ Back to top

    unionBy

    Returns every element that exists in any of the two arrays once, after applying the provided function to each array element of both.

    Create a Set by applying all fn to all values of a. Create a Set from a and all elements in b whose value, after applying fn does not match a value in the previously created set. Return the last set converted to an array.

    const unionBy = (a, b, fn) => {
      const s = new Set(a.map(fn));
      return Array.from(new Set([...a, ...b.filter(x => !s.has(fn(x)))]));
    };
    Examples
    unionBy([2.1], [1.2, 2.3], Math.floor); // [2.1, 1.2]


    ⬆ Back to top

    unionWith

    Returns every element that exists in any of the two arrays once, using a provided comparator function.

    Create a Set with all values of a and values in b for which the comparator finds no matches in a, using Array.prototype.findIndex().

    const unionWith = (a, b, comp) =>
      Array.from(new Set([...a, ...b.filter(x => a.findIndex(y => comp(x, y)) === -1)]));
    Examples
    unionWith([1, 1.2, 1.5, 3, 0], [1.9, 3, 0, 3.9], (a, b) => Math.round(a) === Math.round(b)); // [1, 1.2, 1.5, 3, 0, 3.9]


    ⬆ Back to top

    uniqueElements

    Returns all unique values of an array.

    Use ES6 Set and the ...rest operator to discard all duplicated values.

    const uniqueElements = arr => [...new Set(arr)];
    Examples
    uniqueElements([1, 2, 2, 3, 4, 4, 5]); // [1, 2, 3, 4, 5]


    ⬆ Back to top

    uniqueElementsBy

    Returns all unique values of an array, based on a provided comparator function.

    Use Array.prototype.reduce() and Array.prototype.some() for an array containing only the first unique occurence of each value, based on the comparator function, fn. The comparator function takes two arguments: the values of the two elements being compared.

    const uniqueElementsBy = (arr, fn) =>
      arr.reduce((acc, v) => {
        if (!acc.some(x => fn(v, x))) acc.push(v);
        return acc;
      }, []);
    Examples
    uniqueElementsBy(
      [
        { id: 0, value: 'a' },
        { id: 1, value: 'b' },
        { id: 2, value: 'c' },
        { id: 1, value: 'd' },
        { id: 0, value: 'e' }
      ],
      (a, b) => a.id == b.id
    ); // [ { id: 0, value: 'a' }, { id: 1, value: 'b' }, { id: 2, value: 'c' } ]


    ⬆ Back to top

    uniqueElementsByRight

    Returns all unique values of an array, based on a provided comparator function.

    Use Array.prototype.reduce() and Array.prototype.some() for an array containing only the last unique occurence of each value, based on the comparator function, fn. The comparator function takes two arguments: the values of the two elements being compared.

    const uniqueElementsByRight = (arr, fn) =>
      arr.reduceRight((acc, v) => {
        if (!acc.some(x => fn(v, x))) acc.push(v);
        return acc;
      }, []);
    Examples
    uniqueElementsByRight(
      [
        { id: 0, value: 'a' },
        { id: 1, value: 'b' },
        { id: 2, value: 'c' },
        { id: 1, value: 'd' },
        { id: 0, value: 'e' }
      ],
      (a, b) => a.id == b.id
    ); // [ { id: 0, value: 'e' }, { id: 1, value: 'd' }, { id: 2, value: 'c' } ]


    ⬆ Back to top

    uniqueSymmetricDifference

    Returns the unique symmetric difference between two arrays, not containing duplicate values from either array.

    Use Array.prototype.filter() and Array.prototype.includes() on each array to remove values contained in the other, then create a Set from the results, removing duplicate values.

    const uniqueSymmetricDifference = (a, b) => [
      ...new Set([...a.filter(v => !b.includes(v)), ...b.filter(v => !a.includes(v))])
    ];
    Examples
    uniqueSymmetricDifference([1, 2, 3], [1, 2, 4]); // [3, 4]
    uniqueSymmetricDifference([1, 2, 2], [1, 3, 1]); // [2, 3]


    ⬆ Back to top

    unzip

    Creates an array of arrays, ungrouping the elements in an array produced by zip.

    Use Math.max.apply() to get the longest subarray in the array, Array.prototype.map() to make each element an array. Use Array.prototype.reduce() and Array.prototype.forEach() to map grouped values to individual arrays.

    const unzip = arr =>
      arr.reduce(
        (acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc),
        Array.from({
          length: Math.max(...arr.map(x => x.length))
        }).map(x => [])
      );
    Examples
    unzip([['a', 1, true], ['b', 2, false]]); // [['a', 'b'], [1, 2], [true, false]]
    unzip([['a', 1, true], ['b', 2]]); // [['a', 'b'], [1, 2], [true]]


    ⬆ Back to top

    unzipWith advanced

    Creates an array of elements, ungrouping the elements in an array produced by zip and applying the provided function.

    Use Math.max.apply() to get the longest subarray in the array, Array.prototype.map() to make each element an array. Use Array.prototype.reduce() and Array.prototype.forEach() to map grouped values to individual arrays. Use Array.prototype.map() and the spread operator (...) to apply fn to each individual group of elements.

    const unzipWith = (arr, fn) =>
      arr
        .reduce(
          (acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc),
          Array.from({
            length: Math.max(...arr.map(x => x.length))
          }).map(x => [])
        )
        .map(val => fn(...val));
    Examples
    unzipWith([[1, 10, 100], [2, 20, 200]], (...args) => args.reduce((acc, v) => acc + v, 0)); // [3, 30, 300]


    ⬆ Back to top

    without

    Filters out the elements of an array, that have one of the specified values.

    Use Array.prototype.filter() to create an array excluding(using !Array.includes()) all given values.

    (For a snippet that mutates the original array see pull)

    const without = (arr, ...args) => arr.filter(v => !args.includes(v));
    Examples
    without([2, 1, 2, 3], 1, 2); // [3]


    ⬆ Back to top

    xProd

    Creates a new array out of the two supplied by creating each possible pair from the arrays.

    Use Array.prototype.reduce(), Array.prototype.map() and Array.prototype.concat() to produce every possible pair from the elements of the two arrays and save them in an array.

    const xProd = (a, b) => a.reduce((acc, x) => acc.concat(b.map(y => [x, y])), []);
    Examples
    xProd([1, 2], ['a', 'b']); // [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]


    ⬆ Back to top

    zip

    Creates an array of elements, grouped based on the position in the original arrays.

    Use Math.max.apply() to get the longest array in the arguments. Creates an array with that length as return value and use Array.from() with a map-function to create an array of grouped elements. If lengths of the argument-arrays vary, undefined is used where no value could be found.

    const zip = (...arrays) => {
      const maxLength = Math.max(...arrays.map(x => x.length));
      return Array.from({ length: maxLength }).map((_, i) => {
        return Array.from({ length: arrays.length }, (_, k) => arrays[k][i]);
      });
    };
    Examples
    zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]]
    zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]]


    ⬆ Back to top

    zipObject

    Given an array of valid property identifiers and an array of values, return an object associating the properties to the values.

    Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using Array.prototype.reduce().

    const zipObject = (props, values) =>
      props.reduce((obj, prop, index) => ((obj[prop] = values[index]), obj), {});
    Examples
    zipObject(['a', 'b', 'c'], [1, 2]); // {a: 1, b: 2, c: undefined}
    zipObject(['a', 'b'], [1, 2, 3]); // {a: 1, b: 2}


    ⬆ Back to top

    zipWith advanced

    Creates an array of elements, grouped based on the position in the original arrays and using function as the last value to specify how grouped values should be combined.

    Check if the last argument provided is a function. Use Math.max() to get the longest array in the arguments. Creates an array with that length as return value and use Array.from() with a map-function to create an array of grouped elements. If lengths of the argument-arrays vary, undefined is used where no value could be found. The function is invoked with the elements of each group (...group).

    const zipWith = (...array) => {
      const fn = typeof array[array.length - 1] === 'function' ? array.pop() : undefined;
      return Array.from(
        { length: Math.max(...array.map(a => a.length)) },
        (_, i) => (fn ? fn(...array.map(a => a[i])) : array.map(a => a[i]))
      );
    };
    Examples
    zipWith([1, 2], [10, 20], [100, 200], (a, b, c) => a + b + c); // [111,222]
    zipWith(
      [1, 2, 3],
      [10, 20],
      [100, 200],
      (a, b, c) => (!= null ? a : 'a') + (!= null ? b : 'b') + (!= null ? c : 'c')
    ); // [111, 222, '3bc']


    ⬆ Back to top


    🌐 Browser

    arrayToHtmlList

    Converts the given array elements into <li> tags and appends them to the list of the given id.

    Use Array.prototype.map(), document.querySelector(), and an anonymous inner closure to create a list of html tags.

    const arrayToHtmlList = (arr, listID) =>
      (el => (
        (el = document.querySelector('#' + listID)),
        (el.innerHTML += arr.map(item => `<li>${item}</li>`).join(''))
      ))();
    Examples
    arrayToHtmlList(['item 1', 'item 2'], 'myListID');


    ⬆ Back to top

    bottomVisible

    Returns true if the bottom of the page is visible, false otherwise.

    Use scrollY, scrollHeight and clientHeight to determine if the bottom of the page is visible.

    const bottomVisible = () =>
      document.documentElement.clientHeight + window.scrollY >=
      (document.documentElement.scrollHeight || document.documentElement.clientHeight);
    Examples
    bottomVisible(); // true


    ⬆ Back to top

    copyToClipboard advanced

    ⚠️ NOTICE: The same functionality can be easily implemented by using the new asynchronous Clipboard API, which is still experimental but should be used in the future instead of this snippet. Find out more about it here.

    Copy a string to the clipboard. Only works as a result of user action (i.e. inside a click event listener).

    Create a new <textarea> element, fill it with the supplied data and add it to the HTML document. Use Selection.getRangeAt()to store the selected range (if any). Use document.execCommand('copy') to copy to the clipboard. Remove the <textarea> element from the HTML document. Finally, use Selection().addRange() to recover the original selected range (if any).

    const copyToClipboard = str => {
      const el = document.createElement('textarea');
      el.value = str;
      el.setAttribute('readonly', '');
      el.style.position = 'absolute';
      el.style.left = '-9999px';
      document.body.appendChild(el);
      const selected =
        document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false;
      el.select();
      document.execCommand('copy');
      document.body.removeChild(el);
      if (selected) {
        document.getSelection().removeAllRanges();
        document.getSelection().addRange(selected);
      }
    };
    Examples
    copyToClipboard('Lorem ipsum'); // 'Lorem ipsum' copied to clipboard.


    ⬆ Back to top

    counter advanced

    Creates a counter with the specified range, step and duration for the specified selector.

    Check if step has the proper sign and change it accordingly. Use setInterval() in combination with Math.abs() and Math.floor() to calculate the time between each new text draw. Use document.querySelector().innerHTML to update the value of the selected element. Omit the fourth parameter, step, to use a default step of 1. Omit the fifth parameter, duration, to use a default duration of 2000ms.

    const counter = (selector, start, end, step = 1, duration = 2000) => {
      let current = start,
        _step = (end - start) * step < 0 ? -step : step,
        timer = setInterval(() => {
          current += _step;
          document.querySelector(selector).innerHTML = current;
          if (current >= end) document.querySelector(selector).innerHTML = end;
          if (current >= end) clearInterval(timer);
        }, Math.abs(Math.floor(duration / (end - start))));
      return timer;
    };
    Examples
    counter('#my-id', 1, 1000, 5, 2000); // Creates a 2-second timer for the element with id="my-id"


    ⬆ Back to top

    createElement

    Creates an element from a string (without appending it to the document). If the given string contains multiple elements, only the first one will be returned.

    Use document.createElement() to create a new element. Set its innerHTML to the string supplied as the argument. Use ParentNode.firstElementChild to return the element version of the string.

    const createElement = str => {
      const el = document.createElement('div');
      el.innerHTML = str;
      return el.firstElementChild;
    };
    Examples
    const el = createElement(
      `<div class="container">
        <p>Hello!</p>
      </div>`
    );
    console.log(el.className); // 'container'


    ⬆ Back to top

    createEventHub advanced

    Creates a pub/sub (publish–subscribe) event hub with emit, on, and off methods.

    Use Object.create(null) to create an empty hub object that does not inherit properties from Object.prototype. For emit, resolve the array of handlers based on the event argument and then run each one with Array.prototype.forEach() by passing in the data as an argument. For on, create an array for the event if it does not yet exist, then use Array.prototype.push() to add the handler to the array. For off, use Array.prototype.findIndex() to find the index of the handler in the event array and remove it using Array.prototype.splice().

    const createEventHub = () => ({
      hub: Object.create(null),
      emit(event, data) {
        (this.hub[event] || []).forEach(handler => handler(data));
      },
      on(event, handler) {
        if (!this.hub[event]) this.hub[event] = [];
        this.hub[event].push(handler);
      },
      off(event, handler) {
        const i = (this.hub[event] || []).findIndex(h => h === handler);
        if (> -1) this.hub[event].splice(i, 1);
      }
    });
    Examples
    const handler = data => console.log(data);
    const hub = createEventHub();
    let increment = 0;
     
    // Subscribe: listen for different types of events
    hub.on('message', handler);
    hub.on('message', () => console.log('Message event fired'));
    hub.on('increment', () => increment++);
     
    // Publish: emit events to invoke all handlers subscribed to them, passing the data to them as an argument
    hub.emit('message', 'hello world'); // logs 'hello world' and 'Message event fired'
    hub.emit('message', { hello: 'world' }); // logs the object and 'Message event fired'
    hub.emit('increment'); // `increment` variable is now 1
     
    // Unsubscribe: stop a specific handler from listening to the 'message' event
    hub.off('message', handler);


    ⬆ Back to top

    currentURL

    Returns the current URL.

    Use window.location.href to get current URL.

    const currentURL = () => window.location.href;
    Examples
    currentURL(); // 'https://google.com'


    ⬆ Back to top

    detectDeviceType

    Detects wether the website is being opened in a mobile device or a desktop/laptop.

    Use a regular expression to test the navigator.userAgent property to figure out if the device is a mobile device or a desktop/laptop.

    const detectDeviceType = () =>
      /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
        ? 'Mobile'
        : 'Desktop';
    Examples
    detectDeviceType(); // "Mobile" or "Desktop"


    ⬆ Back to top

    elementContains

    Returns true if the parent element contains the child element, false otherwise.

    Check that parent is not the same element as child, use parent.contains(child) to check if the parent element contains the child element.

    const elementContains = (parent, child) => parent !== child && parent.contains(child);
    Examples
    elementContains(document.querySelector('head'), document.querySelector('title')); // true
    elementContains(document.querySelector('body'), document.querySelector('body')); // false


    ⬆ Back to top

    elementIsVisibleInViewport advanced

    Returns true if the element specified is visible in the viewport, false otherwise.

    Use Element.getBoundingClientRect() and the window.inner(Width|Height) values to determine if a given element is visible in the viewport. Omit the second argument to determine if the element is entirely visible, or specify true to determine if it is partially visible.

    const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
      const { top, left, bottom, right } = el.getBoundingClientRect();
      const { innerHeight, innerWidth } = window;
      return partiallyVisible
        ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
            ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
        : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
    };
    Examples
    // e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
    elementIsVisibleInViewport(el); // false - (not fully visible)
    elementIsVisibleInViewport(el, true); // true - (partially visible)


    ⬆ Back to top

    getImages

    Fetches all images from within an element and puts them into an array

    Use Element.prototype.getElementsByTagName() to fetch all <img> elements inside the provided element, Array.prototype.map() to map every src attribute of their respective <img> element, then create a Set to eliminate duplicates and return the array.

    const getImages = (el, includeDuplicates = false) => {
      const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'));
      return includeDuplicates ? images : [...new Set(images)];
    };
    Examples
    getImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...']
    getImages(document, false); // ['image1.jpg', 'image2.png', '...']


    ⬆ Back to top

    getScrollPosition

    Returns the scroll position of the current page.

    Use pageXOffset and pageYOffset if they are defined, otherwise scrollLeft and scrollTop. You can omit el to use a default value of window.

    const getScrollPosition = (el = window) => ({
      x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
      y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
    });
    Examples
    getScrollPosition(); // {x: 0, y: 200}


    ⬆ Back to top

    getStyle

    Returns the value of a CSS rule for the specified element.

    Use Window.getComputedStyle() to get the value of the CSS rule for the specified element.

    const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName];
    Examples
    getStyle(document.querySelector('p'), 'font-size'); // '16px'


    ⬆ Back to top

    hasClass

    Returns true if the element has the specified class, false otherwise.

    Use element.classList.contains() to check if the element has the specified class.

    const hasClass = (el, className) => el.classList.contains(className);
    Examples
    hasClass(document.querySelector('p.special'), 'special'); // true


    ⬆ Back to top

    hashBrowser advanced

    Creates a hash for a value using the SHA-256 algorithm. Returns a promise.

    Use the SubtleCrypto API to create a hash for the given value.

    const hashBrowser = val =>
      crypto.subtle.digest('SHA-256', new TextEncoder('utf-8').encode(val)).then(h => {
        let hexes = [],
          view = new DataView(h);
        for (let i = 0; i < view.byteLength; i += 4)
          hexes.push(('00000000' + view.getUint32(i).toString(16)).slice(-8));
        return hexes.join('');
      });
    Examples
    hashBrowser(JSON.stringify({ a: 'a', b: [1, 2, 3, 4], foo: { c: 'bar' } })).then(console.log); // '04aa106279f5977f59f9067fa9712afc4aedc6f5862a8defc34552d8c7206393'


    ⬆ Back to top

    hide

    Hides all the elements specified.

    Use NodeList.prototype.forEach() to apply display: none to each element specified.

    const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));
    Examples
    hide(document.querySelectorAll('img')); // Hides all <img> elements on the page


    ⬆ Back to top

    httpsRedirect

    Redirects the page to HTTPS if its currently in HTTP. Also, pressing the back button doesn't take it back to the HTTP page as its replaced in the history.

    Use location.protocol to get the protocol currently being used. If it's not HTTPS, use location.replace() to replace the existing page with the HTTPS version of the page. Use location.href to get the full address, split it with String.prototype.split() and remove the protocol part of the URL.

    const httpsRedirect = () => {
      if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]);
    };
    Examples
    httpsRedirect(); // If you are on http://mydomain.com, you are redirected to https://mydomain.com


    ⬆ Back to top

    insertAfter

    Inserts an HTML string after the end of the specified element.

    Use el.insertAdjacentHTML() with a position of 'afterend' to parse htmlString and insert it after the end of el.

    const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString);
    Examples
    insertAfter(document.getElementById('myId'), '<p>after</p>'); // <div id="myId">...</div> <p>after</p>


    ⬆ Back to top

    insertBefore

    Inserts an HTML string before the start of the specified element.

    Use el.insertAdjacentHTML() with a position of 'beforebegin' to parse htmlString and insert it before the start of el.

    const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString);
    Examples
    insertBefore(document.getElementById('myId'), '<p>before</p>'); // <p>before</p> <div id="myId">...</div>


    ⬆ Back to top

    isBrowserTabFocused

    Returns true if the browser tab of the page is focused, false otherwise.

    Use the Document.hidden property, introduced by the Page Visibility API to check if the browser tab of the page is visible or hidden.

    const isBrowserTabFocused = () => !document.hidden;
    Examples
    isBrowserTabFocused(); // true


    ⬆ Back to top

    nodeListToArray

    Converts a NodeList to an array.

    Use spread operator inside new array to convert a NodeList to an array.

    const nodeListToArray = nodeList => [...nodeList];
    Examples
    nodeListToArray(document.childNodes); // [ <!DOCTYPE html>, html ]


    ⬆ Back to top

    observeMutations advanced

    Returns a new MutationObserver and runs the provided callback for each mutation on the specified element.

    Use a MutationObserver to observe mutations on the given element. Use Array.prototype.forEach() to run the callback for each mutation that is observed. Omit the third argument, options, to use the default options (all true).

    const observeMutations = (element, callback, options) => {
      const observer = new MutationObserver(mutations => mutations.forEach(m => callback(m)));
      observer.observe(
        element,
        Object.assign(
          {
            childList: true,
            attributes: true,
            attributeOldValue: true,
            characterData: true,
            characterDataOldValue: true,
            subtree: true
          },
          options
        )
      );
      return observer;
    };
    Examples
    const obs = observeMutations(document, console.log); // Logs all mutations that happen on the page
    obs.disconnect(); // Disconnects the observer and stops logging mutations on the page


    ⬆ Back to top

    off

    Removes an event listener from an element.

    Use EventTarget.removeEventListener() to remove an event listener from an element. Omit the fourth argument opts to use false or specify it based on the options used when the event listener was added.

    const off = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts);
    Examples
    const fn = () => console.log('!');
    document.body.addEventListener('click', fn);
    off(document.body, 'click', fn); // no longer logs '!' upon clicking on the page


    ⬆ Back to top

    on

    Adds an event listener to an element with the ability to use event delegation.

    Use EventTarget.addEventListener() to add an event listener to an element. If there is a target property supplied to the options object, ensure the event target matches the target specified and then invoke the callback by supplying the correct this context. Returns a reference to the custom delegator function, in order to be possible to use with off. Omit opts to default to non-delegation behavior and event bubbling.

    const on = (el, evt, fn, opts = {}) => {
      const delegatorFn = e => e.target.matches(opts.target) && fn.call(e.target, e);
      el.addEventListener(evt, opts.target ? delegatorFn :