Skip to content

Instantly share code, notes, and snippets.

@stalmok
Created February 11, 2019 01:34
Show Gist options
  • Select an option

  • Save stalmok/26534cb38e2d36ff4fe9dd5be5d6d569 to your computer and use it in GitHub Desktop.

Select an option

Save stalmok/26534cb38e2d36ff4fe9dd5be5d6d569 to your computer and use it in GitHub Desktop.

Revisions

  1. stalmok created this gist Feb 11, 2019.
    45 changes: 45 additions & 0 deletions flatten.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    /**
    * Code was written in Javascript (ES6)
    * Tests will work only in Node.js environment
    */

    /**
    * Flatten an array of arbitrarily nested arrays of integers into
    * a flat array of integers. e.g. [[1,2,[3]],4] -> [1,2,3,4].
    *
    * @param {Array} input
    */
    function flatten(input) {
    if (!Array.isArray(input)) {
    throw TypeError(`An Array is expected, ${typeof input} was given.`);
    }

    let result = [];

    input.forEach(element => {
    result.push(...(Array.isArray(element) ? flatten(element) : [element]));
    });

    return result;
    }

    /** Tests */
    const assert = require('assert');

    assert.throws(() => flatten(), TypeError);
    assert.throws(() => flatten(null), TypeError);
    assert.throws(() => flatten(1), TypeError);
    assert.throws(() => flatten('string'), TypeError);
    assert.throws(() => flatten(false), TypeError);
    assert.throws(() => flatten({}), TypeError);
    assert.throws(() => flatten(NaN), TypeError);
    assert.throws(() => flatten(Symbol()), TypeError);
    assert.throws(() => flatten(() => {}), TypeError);

    assert.deepEqual(flatten([]), []);
    assert.deepEqual(flatten([1, 2, 3]), [1, 2, 3]);
    assert.deepEqual(flatten([1, 2, [3]]), [1, 2, 3]);
    assert.deepEqual(flatten([1, 2, [3, [4]]]), [1, 2, 3, 4]);
    assert.deepEqual(flatten([[1, 2, [3]], 4]), [1, 2, 3, 4]);
    assert.deepEqual(flatten([[1, 2, 3, 4]]), [1, 2, 3, 4]);
    assert.deepEqual(flatten([[[[[1]]]]]), [1]);