Skip to content

Instantly share code, notes, and snippets.

@cssimsek
Last active June 23, 2019 01:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cssimsek/cd151ba2fa6a9346db7280d731333d28 to your computer and use it in GitHub Desktop.
Save cssimsek/cd151ba2fa6a9346db7280d731333d28 to your computer and use it in GitHub Desktop.
Flatten W3C Data Layer to flat Tealium utag
(function (w) {
let w3c_DL_NS = 'YOUR_W3C_DL_NS';
if (w3c_DL_NS in w && 'utag_data' in w) {
w3c_DL_NS = w[w3c_DL_NS];
flatten(w3c_DL_NS);
}
function flatten(object, keyTree) {
keyTree = keyTree || 'w3c';
if (object instanceof Object) {
if (Array.isArray(object)) {
for (var i = 0; i < object.length; i += 1) {
flatten(object[i], keyTree.concat('-' + i));
}
} else {
for (var prop in object) {
if (object.hasOwnProperty(prop)) {
flatten(object[prop], keyTree.concat('-' + prop));
}
}
}
} else {
w['utag_data'][keyTree] = object;
}
}
})(window);
@cssimsek
Copy link
Author

cssimsek commented Jun 22, 2019

In Node.js object instanceof Object appears to fail. Replacing it with /(Array|Object)/g.test(object.constructor.toString()) offers a solution.

async function flattenW3C(object, keyTree, targetObject){
    async function flatten(object, keyTree, targetObject) {
        keyTree = keyTree || 'digitalData';
        if (!!object && /(Array|Object)/g.test(object.constructor.toString())) {
            if (Array.isArray(object)) {
                for (var i = 0; i < object.length; i += 1) {
                    await flatten(object[i], keyTree.concat('-' + i),targetObject);
                }
            } else {
                for (var prop in object) {
                    if (object.hasOwnProperty(prop)) {
                        await flatten(object[prop], keyTree.concat('-' + prop),targetObject);
                    }
                }
            }
        } else {
            targetObject[keyTree] = object;
        }
    }
    await  flatten(object, keyTree, targetObject);
    return targetObject;
}

module.exports.flatten = flattenW3C;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment