如何正确使用dataLayer.push()来更新数组中嵌套对象的值?

时间:2015-12-10 22:33:38

标签: javascript arrays google-analytics google-tag-manager google-datalayer

这是我的dataLayer数组:

dataLayer = [{
  'giftBatch' : {
    'giftID': '',
    'giftAmount': 0,
    'giftCount': 0,
    'giftUpdate': {
      'giftPhase': 'Gift Empty'
    }
  },
  'txBatch': {
    'txID': '',
    'txTotal': 0,
    'txURL': window.location.href,
    'txUpdate': {
      'txPhase': 'Transaction Opened',
      'txT0': new Date(),
      'txT1': ''
      'txT2': ''
    }
  }
}];

控制台结果为:Array [Object1]

Object1根据需要包含'giftBatch'和'txBatch'对象。

我有一个触发器,稍后会触发更新dataLayer中的对象。

例如,将'giftAmount'更新为50,将'giftCount'更新为1.

我尝试了以下内容(我只是展示了我一次尝试修改'一个对象'的失败尝试),

尝试1:

dataLayer.push({giftAmount : 50});

结果:

数组[object1,object2]

Object1与上面相同,

Object2是一个新对象,其属性为'Gift Amount':50

尝试2:

dataLayer.push({giftBatch.giftAmount: 222});

结果: SyntaxError:missing:属性id之后

尝试3:

dataLayer.push({'giftBatch.giftAmount' : 50});

结果:

数组[object1,object2]

Object1与上面相同,

Object2是一个新对象,其属性为'giftBatch.giftAmount':50

我在这里做错了什么?

根据此处的dataLayer部分:https://support.google.com/tagmanager/answer/6106899?hl=en

我应该可以编辑嵌套对象值。

PS。这就是我现在使用的,它确实有效。但是,为什么不推动工作呢?

dataLayer[index].giftBatch.giftAmount = 50;

其中index是Object2的索引。

任何帮助都会很棒。

谢谢。

1 个答案:

答案 0 :(得分:4)

编辑dataLayer的现有内容是不好的做法,但您只需要发送如下的覆盖属性值:

dataLayer.push({'giftBatch':{'giftAmount' : 50}});

标记管理器从最新的Object开始,并将继续查看之前的对象以确定每个DataLayer变量的当前设置,因此只有giftBatch.giftAmount被这个新推送覆盖。

以下是预览调试器的示例,其中显示了dataLayer的新test对象的合并视图,其中包含以前消息的属性:

GTM preview debugger DataLayer view

解释此调试器数据层视图

在这种情况下,先前的消息(#4和/或#5)以最小值推送:

 {test:{test:8}} // #6 does not contain test.test so it is from earlier

最大他们本可以推动:

 {test:{test:..,foo:..,test3:..}} // #4 if it's been completely shadowed
 {test:{test:8,foo:..,test3:..}} // #5 if it has test.test, must have 8

#3和#7之间没有标记,因为Messages是缺少event属性的对象,因此当下次发生跟踪时,#4&#5中的任何阴影值都应被视为无法访问在事件#7上触发的标签。