JSFiddle - React, Tailwind, and code Playground

JavaScript

Object.prototype.GetHashCode = function () {
    var s = this instanceof Object ? JSON.stringify(this) : this.toString();

    var hash = 0;
    if (s.length === 0) return hash;
    for (var i = 0; i < s.length; ++i) {
        hash = ((hash << 5) - hash) + s.charCodeAt(i);
    }
    return hash;
};
Number.prototype.GetHashCode = function () { return this.valueOf(); };


function GroupByToArray(a, keySelector, elementSelector, comparer)
{
    elementSelector = elementSelector || function(e) { return e; };
    comparer = comparer ||
        {
            Equals: function(a,b) { return a==b },
            GetHashCode: function(e) { return e.GetHashCode(); }
        };
    
    var key, hashKey, reHashKey;
    var hashs = {};
    for (var i = 0, n = a.length; i < n; ++i)
    {
        reHashKey = undefined;
        
        key = keySelector(a[i]);
        hashKey = comparer.GetHashCode(key);
        
        if (typeof hashs[hashKey] !== "undefined")
            reHashKey = comparer.Equals(key, hashs[hashKey].Key) ? hashKey : hashKey + " " + i;
        
        if (typeof reHashKey !== "undefined" && reHashKey !== hashKey)
            hashKey = reHashKey;
        
        hashs[hashKey] = hashs[hashKey] || { Key: key, Elements: [] };
        hashs[hashKey].Elements.push(elementSelector(a[i]));
    }
    
    var keys = Object.keys(hashs);
    var ret = [];
    for (var i = 0, n = keys.length; i < n; ++i)
    {
        ret.push(hashs[keys[i]]);
    }

    return ret;
}

function GroupBy(a, keySelector, elementSelector, comparer)
{
    elementSelector = elementSelector || function(e) { return e; };
    comparer = comparer ||
        {
            Equals: function(a,b) { return a==b },
            GetHashCode: function(e) { return e.GetHashCode(); }
        };
    
    var key, hashKey, reHashKey;
    var hashs = {};
    for (var i = 0, n = a.length; i < n; ++i)
    {
        reHashKey = undefined;
        
        key = keySelector(a[i]);
        hashKey =...