{"ScriptPreparationCode":"function iter2(output, nullish, sep, val, key) {\r\n var k,\r\n pfx = key ? key \u002B sep : key;\r\n if (val == null) {\r\n if (nullish){\r\n data = {};\r\n data[key] = val; \r\n // output.push(key || \u0027root\u0027);\r\n }\r\n } else if (typeof val != \u0027object\u0027 || Array.isArray(val)) {\r\n data = {};\r\n data[key] = val; \r\n // output.push(key || \u0027root\u0027);\r\n \r\n } else {\r\n data = {};\r\n data[key] = val; \r\n // output.push(key || \u0027root\u0027);\r\n for (k in val) {\r\n iter2(output, nullish, sep, val[k], pfx \u002B k);\r\n }\r\n }\r\n output.push(key || \u0027root\u0027);\r\n\r\n }\r\n \r\nfunction flattieArray(input, glue, toNull) {\r\n var output = [];\r\n if (typeof input == \u0027object\u0027) {\r\n iter2(output, !!toNull, glue || \u0027.\u0027, input, \u0027\u0027);\r\n }\r\n return output;\r\n }\r\n\r\n\r\nfunction iter(output, nullish, sep, val, key) {\r\n var k,\r\n pfx = key ? key \u002B sep : key;\r\n if (val == null) {\r\n if (nullish) output[key] = val;\r\n } else if (typeof val != \u0027object\u0027 || Array.isArray(val)) {\r\n output[key] = val;\r\n } else {\r\n for (k in val) {\r\n iter(output, nullish, sep, val[k], pfx \u002B k);\r\n }\r\n }\r\n}\r\n\r\nfunction flattie(input, glue, toNull) {\r\n var output = {};\r\n if (typeof input == \u0027object\u0027) {\r\n iter(output, !!toNull, glue || \u0027.\u0027, input, \u0027\u0027);\r\n }\r\n return output;\r\n}\r\n\r\nfunction empty(key) {\r\n var char = key.charCodeAt(0);\r\n return char \u003E 47 \u0026\u0026 char \u003C 58 ? [] : {};\r\n}\r\n\r\nfunction nestie(input, glue) {\r\n glue = glue || \u0027.\u0027;\r\n var arr, tmp, output;\r\n var i = 0,\r\n k,\r\n key;\r\n\r\n for (k in input) {\r\n tmp = output; // reset\r\n arr = k.split(glue);\r\n // console.log(\u0027key\u0027,k);\r\n for (i = 0; i \u003C arr.length; ) {\r\n key = arr[i\u002B\u002B];\r\n\r\n if (tmp == null) {\r\n tmp = empty(\u0027\u0027 \u002B key);\r\n output = output || tmp;\r\n }\r\n // console.log(\u0027key inner\u0027, key, tmp);\r\n if (key == \u0027__proto__\u0027 || key == \u0027constructor\u0027 || key == \u0027prototype\u0027) break;\r\n\r\n if (i \u003C arr.length) {\r\n if (key in tmp) {\r\n // console.log(\u0027key inner\u0027, key, JSON.stringify(tmp[key],null,2));\r\n\r\n if (typeof tmp[key] !== \u0027object\u0027) {\r\n var ok = tmp[key];\r\n tmp[key] = empty(\u0027\u0027 \u002B arr[i]);\r\n tmp[key][\u0027_\u0027\u002Bkey] = ok;\r\n }\r\n tmp = tmp[key];\r\n } else {\r\n tmp = tmp[key] = empty(\u0027\u0027 \u002B arr[i]);\r\n }\r\n } else {\r\n tmp[key] = input[k];\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction nestie2(input, glue) {\r\n glue = glue || \u0027.\u0027;\r\n var arr, tmp, output;\r\n var i = 0,\r\n k,\r\n key;\r\n var kz = Object.keys(input).sort();\r\n //console.log(\u0027keys\u0027,JSON.stringify(kz,null,2));\r\n var kl = kz.length;\r\n for (let index = 0; index \u003C kl; index\u002B\u002B) {\r\n let k = kz[index];\r\n let v = input[k];\r\n tmp = output; // reset\r\n arr = k.split(glue);\r\n for (i = 0; i \u003C arr.length; ) {\r\n key = arr[i\u002B\u002B];\r\n\r\n if (tmp == null) {\r\n tmp = empty(\u0027\u0027 \u002B key);\r\n output = output || tmp;\r\n }\r\n //console.log(\u0027key2\u0027,k,key,tmp);\r\n if (key == \u0027__proto__\u0027 || key == \u0027constructor\u0027 || key == \u0027prototype\u0027) break;\r\n if (i \u003C arr.length) {\r\n if (key in tmp) {\r\n if (typeof tmp[key] !== \u0027object\u0027) {\r\n var ok = tmp[key];\r\n tmp[key] = empty(\u0027\u0027 \u002B arr[i]);\r\n tmp[key][\u0027_\u0027\u002Bkey] = ok;\r\n tmp = tmp[key];\r\n }else{\r\n tmp = tmp[key];\r\n }\r\n \r\n } else {\r\n tmp = tmp[key] = empty(\u0027\u0027 \u002B arr[i]);\r\n }\r\n } else {\r\n if (key in tmp) {\r\n tmp[key][\u0027_\u0027] = v;\r\n }else{\r\n tmp[key] = v;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\nvar data = {x:{y:1},foo:\u0027bar\u0027,products: [1, 2, { three: \u00273\u0027 }], page: { category: { l1: \u0027foo\u0027, l2: \u0027bar\u0027 } } };\r\nvar flat = flattie(data);\r\nflat[\u0027page.category\u0027] = \u0027helloworld\u0027;\r\nflat[\u0027user\u0027] = { a: \u0027b\u0027 };\r\nflat[\u0027foo\u0027] = \u0027bar\u0027;\r\nflat[\u0027page.category.l1\u0027] = \u0027whaaat\u0027;\r\nflat[\u0027products\u0027] = [\u0027a\u0027, \u0027b\u0027];\r\nflat[\u0027foo.bar\u0027] = {\u0027hellow\u0027:\u0027orld\u0027};","TestCases":[{"Name":"Nestie (unsorted)","Code":"var exploded = nestie(flat);","IsDeferred":false},{"Name":"Nestie (sorted)","Code":"var exploded2 = nestie2(flat);","IsDeferred":false}]}