我不太明白你对 nyuens 回答的激烈反应。首先,由于这是 javascript,所以数组也是一个对象,其次,dataLayer 是一个对象数组,或者,正如我们在 JavaScript 中所说的,一个对象(毕竟它被称为 JavaScript Object Notation)。所以你有一个带有数字索引的数组,其中每个元素都是一个对象(它可能又包含其他数组和对象)。
不过,我强烈反对 nyuen 建议使用数字索引来处理 dataLayer 中的元素。如果您在标签管理器代码 dataLayer[0] 包含您的自定义数据之前将数据推送到您的 dataLayer,否则它将包含 gtm.load 事件和相关数据。所以这是不可靠的。
但是,您似乎真正想要的是展平对象,即删除带有数字键的嵌套结构并具有一维结构。 Luckily somebody has written a function that does this:
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;
};
这会从嵌套对象生成“一维”对象。通常这意味着具有相同名称的键将被各自的最后一个元素覆盖。 IE。
dataLayer = [
{'key':value1},
{'key':value2},
]
会产生一个简单的
{'key':value2}
因为第二个“键”覆盖了第一个。然而,上面的函数通过将索引存储为键名的一部分来缓解这种情况,所以你会得到
{'0.key':value1, '1.key':value2}
不幸的是,这意味着您不能使用点语法,而必须使用尖括号来处理元素:
yourvariablename['0.key']