JSFiddle - React, Tailwind, and code Playground
JavaScript
JSON.unflattenKey = function(str) {
if(!str) return null;
var result = {};
result.name = str.replace(/\[\d+\]$/, "");
result.index = -1;
if(/\[\d+\]$/.test(str)) { // has index
result.index = str.match(/\[(\d+)\]$/)[1];
}
return result;
}
JSON.unflatten = function(data) {
if(data === null || typeof data !== "object" || Array.isArray(data)) { // empty array or primitive
return data;
}
var result, temp;
var first = null;
for(var k in data) { first = k; break; };
if(first === null) { // empty object
return {};
} else if(first.indexOf("[") === 0) { // array
result = [];
} else { // object
result = {};
}
for(var k in data) {
var value = data[k];
var obj = result;
var nameParts = k.split(".");
var a, b;
for(var i=0; i<nameParts.length; i++) {
a = JSON.unflattenKey(nameParts[i]);
b = JSON.unflattenKey(nameParts[i+1]);
if(b !== null) { // part with lookahead
if(a.index >= 0 && !a.name) { // raw array
if(typeof obj[a.index] === "undefined") {
obj[a.index] = (!b.name ? [] : {});
}
obj = obj[a.index];
} else if(a.index >= 0 && a.name) { // named array
if(typeof obj[a.name] === "undefined")
obj[a.name] = [];
if(typeof obj[a.name][a.index] === "undefined") {
obj[a.name][a.index] = (!b.name ? [] : {});
}
obj = obj[a.name][a.index];
} else if(a.index < 0 && a.name) { // nested object and property
if(typeof obj[a.name] === "undefined") {
obj[a.name] = (!b.name ? [] : {});
}
obj = obj[a.name];
}
} else { // last part
if(a.index >= 0 && !a.name) { // raw array
if(typeof obj[a.index] === "undefined")
obj[a.index] = value;
} else if(a.index >= 0 && a.name) { // named array
if(typeof obj[a.name] === "undefined")
obj[a.name] = [];
if(typeof...