JSFiddle - React, Tailwind, and code Playground

JavaScript

JSON.unflatten = function(data) {
    "use strict";
    if (Object(data) !== data || Array.isArray(data))
        return data;
    var regex = /\.?([^.\[\]]+)$|\[(\d+)\]$/,
        result;
    while (Object.keys(data).length)
    for (var p in data) {
        var m = regex.exec(p),
            target;
        if (m.index) {
            var rest = p.slice(0, m.index);
            target = data[rest] || (data[rest] = (m[2] ? [] : {}));
        } else {
            target = result || (result = (m[2] ? [] : {}));
        }
        target[m[2] || m[1]] = data[p];
        delete data[p];
    }
    return result;
};
JSON.flatten = function(data) {
    "use strict";
    var result = {};
    function recurse (cur, prop) {
        if (Object(cur) !== cur) {
            result[prop] = cur;
        } else if (Array.isArray(cur)) {
             for(var i=0, l=cur.length; i<l; i++)
                 recurse(cur[i], prop + "[" + i + "]");
            if (l == 0)
                result[prop] = [];
        } else {
            var isEmpty = true;
            for (var p in cur) {
                isEmpty = false;
                recurse(cur[p], prop ? prop+"."+p : p);
            }
            if (isEmpty)
                result[prop] = {};
        }
    }
    recurse(data, "");
    return result;
}

function benchmark() {
    var tries = 2;
    var count = 5;
    var result = [];
    var time, temp, noOpt;
    for(var x=0; x<tries; x++) {
        noOpt = [];
        time = Date.now();
        for(var i=0; i<count; i++) {
            temp = JSON.parse(JSON.stringify(fillObj({}, 4)));
            touchObj(temp, noOpt);
        }
        time = Date.now() - time;
        result.push("Nested : " + noOpt.length + " : " + time);
        //
        noOpt = [];
        time = Date.now();
        for(var i=0; i<count; i++) {
            temp = JSON.parse(JSON.stringify(fillObj({}, 4)));
            temp = JSON.flatten(temp);
            touchObj(temp, noOpt);
            temp =...