如何将google DataLayer转换为具有变量键值的javascript对象

How can google DataLayer be converted into javascript object with key values for variables?

本文关键字:变量 键值 对象 javascript google DataLayer 转换      更新时间:2023-09-26

当您在网站上使用Google Analytics DataLayer时,您将其作为全局变量DataLayer。您可以将自己的事件变量添加到其中。

如何将其中的所有变量转换为这样的对象

{var:value}

您可以像访问任何其他对象一样访问它:

var dataLayer = [{
   myVar1: 'val1',
   myVar2: 'val2
}]
var myVar1 = dataLayer[0].myVar1;
var myVar2 = dataLayer[0].myVar2;

我不太理解你对nyuens答案的激烈反应。首先,因为这是javascript,所以数组也是一个对象,其次,dataLayer是一个对象数组,或者,正如我们在javascript中所称,是一个物体(毕竟,它被称为javascript物体符号)。因此,您有一个带有数字索引的数组,其中每个元素都是一个对象(反过来可能包含其他数组和对象)。

不过,我强烈反对nyuen关于用数字索引寻址数据层中元素的建议。如果在标记管理器代码dataLayer[0]将包含自定义数据之前将数据推送到dataLayer,则它将包含gtm.load事件和相关数据。所以这是不可靠的。

然而,你真正想要的似乎是压平对象,即删除带有数字键的嵌套结构,并使用一维结构。幸运的是,有人写了一个函数可以做到这一点:

var flattenObject = function(ob) {
    var toReturn = {};
    for (var i in ob) {
        if (!ob.hasOwnProperty(i)) continue;
        if ((typeof ob[i]) == 'object') {
            var flatObject = flattenObject(ob[i]);
            for (var x in flatObject) {
                if (!flatObject.hasOwnProperty(x)) continue;
                toReturn[i + '.' + x] = flatObject[x];
            }
        } else {
            toReturn[i] = ob[i];
        }
    }
    return toReturn;
};

这将从嵌套对象生成一个"一维"对象。通常,这意味着具有相同名称的键将被相应的最后一个元素覆盖。即

dataLayer = [
    {'key':value1},
    {'key':value2},
]

会产生一个简单的

{'key':value2}

因为第二个"键"覆盖了第一个。然而,上面的函数通过将索引存储为密钥名称的一部分来缓解这种情况,因此您将获得

{'0.key':value1, '1.key':value2}

不幸的是,这意味着你不能使用点语法,必须用尖括号来称呼元素:

 yourvariablename['0.key']