Unflatten a JSON object (v3)

Revision 3 of this benchmark created by Robert Koritnik on


Preparation HTML

<script>


function controlUnflatten(data) {
    "use strict";
    if (Object(data) !== data || Array.isArray(data))
        return data;
    var result = {}, cur, prop, parts, idx;
    for(var p in data) {
        cur = result, prop = "";
        parts = p.split(".");
        for(var i=0; i<parts.length; i++) {
            idx = !isNaN(parseInt(parts[i]));
            cur = cur[prop] || (cur[prop] = (idx ? [] : {}));
            prop = parts[i];
        }
        cur[prop] = data[p];
    }
    return result[""];
}

function testUnflatten(table) {
    var result = {};

    for (var path in table) {
        var cursor = result, length = path.length, property = "", index = 0;

        while (index < length) {
            var char = path.charAt(index);

            if (char === "[") {
                var start = index + 1,
                    end = path.indexOf("]", start),
                    cursor = cursor[property] = cursor[property] || [],
                    property = path.slice(start, end),
                    index = end + 1;
            } else {
                var cursor = cursor[property] = cursor[property] || {},
                    start = char === "." ? index + 1 : index,
                    bracket = path.indexOf("[", start),
                    dot = path.indexOf(".", start);

                if (bracket < 0 && dot < 0) var end = index = length;
                else if (bracket < 0) var end = index = dot;
                else if (dot < 0) var end = index = bracket;
                else var end = index = bracket < dot ? bracket : dot;

                var property = path.slice(start, end);
            }
        }

        cursor[property] = table[path];
    }

    return result[""];
}
</script>

Setup

var object = {
        "related[0].related": [],
        "related[0].id": 1759807323,
        "related[0].name": "First Related name",
        "related[0].subs[0]": 1,
        "related[0].subs[1][0]": 1,
        "related[0].subs[1][1]": 2,
        "related[0].subs[2].name": "Does it work?",
        "related[0].subs[2].created": "2014-12-22T22:30:32.234Z",
        "related[0].interest.id": 1314962015,
        "related[0].interest.name": "Ideas",
        "related[0].interest.isLocked": false,
        "related[0].interest.isPrivileged": false,
        "related[0].details": "Lengthy related details that will not be sent to server",
        "related[0].author.id": 28356342,
        "related[0].author.displayName": "John Doe",
        "related[0].author.email": "john.doe@gmail.com",
        "related[0].author.isActive": true,
        "related[1].name": "Afrojack",
        "related[1].title": "Some related title",
        "related[1].details": "Another one with lengthy details",
        "related[1].id": 2345234,
        "related[1].interest.id": 1314962015,
        "related[1].interest.name": "Ideas",
        "related[1].interest.isLocked": false,
        "related[1].interest.isPrivileged": false,
        "related[1].author.id": 28356342,
        "related[1].author.displayName": "Jane Doe",
        "related[1].author.email": "jane.doe@gmail.com",
        "related[1].author.isActive": true,
        "related[1].author.spouse.id": 87962347,
        "related[1].author.spouse.displayName": "Jorge Lopez",
        "related[1].author.spouse.email": "jorge.lopez@gmail.com",
        "related[1].author.spouse.isActive": true,
        "hash": {},
        "name": "My name",
        "interest.id": 1314962015,
        "interest.name": "Ideas",
        "interest.isLocked": false,
        "interest.isPrivileged": false,
        "details": "Some lengthy details"
    };

Test runner

Ready to run.

Testing in
TestOps/sec
Test unflatten
testUnflatten(object);
ready
Control unflatten
controlUnflatten(object);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 1: published by Aadit M Shah on
  • Revision 2: published by Aadit M Shah on
  • Revision 3: published by Robert Koritnik on