Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确使用dataLayer.push()更新数组中嵌套对象的值?_Javascript_Arrays_Google Analytics_Google Tag Manager_Google Datalayer - Fatal编程技术网

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

Javascript 如何正确使用dataLayer.push()更新数组中嵌套对象的值?,javascript,arrays,google-analytics,google-tag-manager,google-datalayer,Javascript,Arrays,Google Analytics,Google Tag Manager,Google Datalayer,以下是我的数据层阵列: dataLayer = [{ 'giftBatch' : { 'giftID': '', 'giftAmount': 0, 'giftCount': 0, 'giftUpdate': { 'giftPhase': 'Gift Empty' } }, 'txBatch': { 'txID': '', 'txTotal': 0, 'txURL': window.location.href,

以下是我的数据层阵列:

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': ''
    }
  }
}];
控制台结果为:数组[Object1]

Object1根据需要包含“giftBatch”和“txBatch”对象

我有一个触发器,稍后触发以更新数据层中的对象

例如,将“giftAmount”更新为50,将“giftCount”更新为1

我尝试了以下方法(我只展示了我修改“一次修改一个对象”的失败尝试)

尝试1:

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

dataLayer.push({giftAmount : 50});
dataLayer.push({giftBatch.giftAmount: 222});
dataLayer.push({'giftBatch.giftAmount' : 50});
数组[object1,object2]

Object1与上面相同

Object2是一个新对象,其属性为“礼品金额”:50

尝试2:

dataLayer.push({giftAmount : 50});
dataLayer.push({giftBatch.giftAmount: 222});
dataLayer.push({'giftBatch.giftAmount' : 50});
结果:语法错误:缺少:在属性id之后

尝试3:

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

dataLayer.push({giftAmount : 50});
dataLayer.push({giftBatch.giftAmount: 222});
dataLayer.push({'giftBatch.giftAmount' : 50});
数组[object1,object2]

Object1与上面相同

Object2是一个属性为“giftBatch.giftAmount”的新对象:50

我做错了什么

根据此处的数据层部分:

我应该能够编辑嵌套对象的值

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

dataLayer[index].giftBatch.giftAmount = 50;
其中index是Object2的索引

任何帮助都会很好


谢谢。

编辑数据层的现有内容是一种不好的做法,但您只需发送覆盖属性值,如下所示:

dataLayer.push({'giftBatch':{'giftAmount' : 50}});
标记管理器从最新的
对象
开始,并将继续向后查看以前的对象,以确定每个数据层变量的当前设置,因此只有
giftBatch.giftAmount
被此新推覆

下面是一个预览调试器的示例,显示了数据层对新
测试
对象的合并视图,该对象具有来自以前消息的属性:

解释此调试器数据层视图 在本例中,以前的消息(#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

由于
消息
是缺少
事件
属性的对象,因此当在事件#7触发的标记上进行跟踪时,#4和#5中的任何阴影值都应被视为不可访问。

这样,如果我推送多个同名对象,例如giftCount,我就可以直接得到它,GTM中的变量将只拾取giftCount的上一次/最近一次迭代,即:
dataLayer.push({'giftCount':1})
dataLayer.push({'giftCount':2})
dataLayer.push({'giftCount':3})
dataLayer.push({'giftCount':4})
GTM变量giftCount等于数据层变量giftCount=4?@rorschaff,但您不必相信我的话,预览调试器将向您显示您添加的内容以及对每个消息的有效数据层和变量的影响。我相信您的话。我重新创建了初始的
dataLayer.push()
,并将所有进一步的.push()设置为遵循相同的操作顺序。GTM只提取最新的数据层变量。来自数据库背景,我担心滥用数据层的容量,但从技术上讲,这是一个每页临时批处理,我认为这不是问题@lossleader谢谢你!