为什么 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})