how to convert this nested object into a flat object?

You could use a recursive function to crawl the object and flatten it for you.

var test = {
    a: 'jack',
    b: {
        c: 'sparrow',
        d: {
            e: 'hahaha'
        }
    }
};

function traverseAndFlatten(currentNode, target, flattenedKey) {
    for (var key in currentNode) {
        if (currentNode.hasOwnProperty(key)) {
            var newKey;
            if (flattenedKey === undefined) {
                newKey = key;
            } else {
                newKey = flattenedKey + '.' + key;
            }

            var value = currentNode[key];
            if (typeof value === "object") {
                traverseAndFlatten(value, target, newKey);
            } else {
                target[newKey] = value;
            }
        }
    }
}

function flatten(obj) {
    var flattenedObject = {};
    traverseAndFlatten(obj, flattenedObject);
    return flattenedObject;
}

var flattened = JSON.stringify(flatten(test));
console.log(flattened);

One way to reverse this, if needed, is a nested set of loops. There is probably a cleaner way to accomplish this though:

var test = {'a':'jack','b.c':'sparrow','b.d.e':'hahaha'};

function expand(target, keySeparator) {
    var result = {};
    for (var key in target) {
        if (target.hasOwnProperty(key)) {
          var nestedKeys = key.split(keySeparator);
          // Get the last subKey
          var leaf = nestedKeys[nestedKeys.length - 1];
          // Get all subKeys except for the last
          var branch = nestedKeys.slice(0, nestedKeys.length - 1);
          
          var currentTarget = result;
          for (var i = 0; i < branch.length; i += 1) {
            var subKey = nestedKeys[i];
            // If this is the first time visiting this branch, we need to instantiate it
            if (currentTarget[subKey] === undefined) {
              currentTarget[subKey] = {};
            }
            // Visit the branch
            currentTarget = currentTarget[subKey];
          }
          currentTarget[leaf] = target[key];
        }
    }
    return result;
}

var expanded = JSON.stringify(expand(test, "."));
console.log(expanded);

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)