为什么 GTM 合并 dataLayer 中的对象值?
Why is GTM merging object values in dataLayer?
我有以下代码:
dataLayer.push({event: 'A',eventAttributes: { attrA: 'a' }});
dataLayer.push({event: 'B',eventAttributes: { attrB: 'b' }});
dataLayer.push({event: 'C',eventAttributes: { attrC: 'c' }});
和一个完全空的 GTM 容器(没有标签、没有触发器、没有变量)。
当我检查 GTM 调试的 Data Layer
选项卡时,我看到了这个:
{
gtm: {start: 1448552543040, uniqueEventId: 1448552543091},
event: 'A',
eventAttributes: {attrA: 'a'}
}
{
gtm: {start: 1448552543040, uniqueEventId: 1448552543092},
event: 'B',
eventAttributes: {attrA: 'a', attrB: 'b'}
}
{
gtm: {start: 1448552543040, uniqueEventId: 1448552543092},
event: 'C',
eventAttributes: {attrA: 'a', attrB: 'b', attrC: 'C'}
}
如您所见,GTM 正在将值合并到 eventAttributes
对象而不是覆盖对象。
Q1:GTM 为什么要这样做?
问题 2:有什么方法可以防止这种情况发生(除了将每个对象 属性 定义为单独的变量之外)?
仅供参考,我在数据层中使用 eventAttributes
对象,因为我想简单地重新使用其中的任何内容作为我基于事件的工具(Mixpanel、KISSmetrics ...)的属性.对于上述问题,如果我必须在 DataLayer 和 GTM 中显式声明所有变量,我只是看不到任何方法来扩展 Mixpanel/KISSmetrics 的 GTM 实现。
更新
在控制台本身查看数据层后,似乎值已正确推送且未合并:
所以GTM一定是在读取dataLayer的时候才决定合并的!
问题 1 的答案:
GTM 这样做是因为这是 DataLayer 的预期行为:
https://github.com/google/data-layer-helper
添加来自 Kitravee Siwatkittisuk 的 Q2 答案,使这个 post 详尽无遗:
问题 2 的答案:
感谢 Kitravee Siwatkittisuk
将 _clear 设置为真 to preventing default recursive merge
dataLayer.push({items: [1], _clear: true})
问题 2 的答案:
将 _clear 设置为真 to preventing default recursive merge
dataLayer.push({items: [1], _clear: true})
我有以下代码:
dataLayer.push({event: 'A',eventAttributes: { attrA: 'a' }});
dataLayer.push({event: 'B',eventAttributes: { attrB: 'b' }});
dataLayer.push({event: 'C',eventAttributes: { attrC: 'c' }});
和一个完全空的 GTM 容器(没有标签、没有触发器、没有变量)。
当我检查 GTM 调试的 Data Layer
选项卡时,我看到了这个:
{
gtm: {start: 1448552543040, uniqueEventId: 1448552543091},
event: 'A',
eventAttributes: {attrA: 'a'}
}
{
gtm: {start: 1448552543040, uniqueEventId: 1448552543092},
event: 'B',
eventAttributes: {attrA: 'a', attrB: 'b'}
}
{
gtm: {start: 1448552543040, uniqueEventId: 1448552543092},
event: 'C',
eventAttributes: {attrA: 'a', attrB: 'b', attrC: 'C'}
}
如您所见,GTM 正在将值合并到 eventAttributes
对象而不是覆盖对象。
Q1:GTM 为什么要这样做?
问题 2:有什么方法可以防止这种情况发生(除了将每个对象 属性 定义为单独的变量之外)?
仅供参考,我在数据层中使用 eventAttributes
对象,因为我想简单地重新使用其中的任何内容作为我基于事件的工具(Mixpanel、KISSmetrics ...)的属性.对于上述问题,如果我必须在 DataLayer 和 GTM 中显式声明所有变量,我只是看不到任何方法来扩展 Mixpanel/KISSmetrics 的 GTM 实现。
更新
在控制台本身查看数据层后,似乎值已正确推送且未合并:
所以GTM一定是在读取dataLayer的时候才决定合并的!
问题 1 的答案:
GTM 这样做是因为这是 DataLayer 的预期行为: https://github.com/google/data-layer-helper
添加来自 Kitravee Siwatkittisuk 的 Q2 答案,使这个 post 详尽无遗:
问题 2 的答案:
感谢 Kitravee Siwatkittisuk
将 _clear 设置为真 to preventing default recursive merge
dataLayer.push({items: [1], _clear: true})
问题 2 的答案:
将 _clear 设置为真 to preventing default recursive merge
dataLayer.push({items: [1], _clear: true})