/**
 * @param {Function} fn
 * @return {Array}
 */
Array.prototype.groupBy = function(fn) {
    let grouped = new Object();

    for (let x of this) {
        let key = fn(x);

        if (grouped[key] === undefined) {
            grouped[key] = new Array();
        }

        grouped[key].push(x);
    }

    return grouped;
};

/**
 * [1,2,3].groupBy(String) // {"1":[1],"2":[2],"3":[3]}
 */