Как правильно использовать dataLayer.push() для обновления значений вложенных объектов в массиве?

Вот мой массив 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': ''
    }
  }
}];

Результаты консоли: Массив [Object1]

Object1 содержит объекты 'giftBatch' и 'txBatch' по желанию.

У меня есть триггер, который срабатывает позже, чтобы обновить объект в dataLayer.

Например, обновите «giftAmount» до 50 и «giftCount» до 1.

Я пробовал следующее (я показываю только свои неудачные попытки изменить «один объект за раз»),

Попытка 1:

dataLayer.push({giftAmount : 50});

Результат:

Массив [объект1, объект2]

Object1 такой же, как и выше,

Объект2 — это новый объект со свойством 'Сумма подарка': 50,

Попытка 2:

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

Результат: SyntaxError: отсутствует: после идентификатора свойства

Попытка 3:

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

Результат:

Массив [объект1, объект2]

Object1 такой же, как и выше,

Object2 — это новый объект со свойством 'giftBatch.giftAmount': 50.

Что я здесь делаю неправильно?

Согласно разделу dataLayer здесь: https://support.google.com/tagmanager/answer/6106899?hl=en

Я должен иметь возможность редактировать значения вложенных объектов.

PS. Это то, что я использую сейчас, и это действительно работает. Но почему не подталкивает работу?

dataLayer[index].giftBatch.giftAmount = 50;

Где index — это индекс Object2.

Любая помощь будет здорово.

Спасибо.


person rorschaff    schedule 10.12.2015    source источник


Ответы (1)


Плохая практика - редактировать существующее содержимое dataLayer, но вам просто нужно отправить значение (я) переопределяющего свойства следующим образом:

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

Диспетчер тегов начинается с последнего Object и будет продолжать просматривать предыдущие объекты, чтобы определить текущую настройку каждой переменной DataLayer, поэтому только giftBatch.giftAmount переопределяется с этим новым толчком.

Вот пример отладчика предварительного просмотра, показывающий объединенное представление dataLayer нового объекта test со свойствами из предыдущих сообщений:

Предварительный просмотр отладчика GTM DataLayer

Интерпретация этого представления уровня данных отладчика

В этом случае предыдущие сообщения (№ 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.

person lossleader    schedule 10.12.2015
comment
Просто чтобы я мог понять это прямо, если я нажму несколько объектов с одним и тем же именем, например. giftCount, переменная в GTM будет получать только последнюю/самую последнюю итерацию giftCount, т.е.: dataLayer.push({'giftCount' : 1}); dataLayer.push({'giftCount' : 2}); dataLayer.push({'giftCount' : 3}); dataLayer.push({'giftCount' : 4}); Переменная GTM giftCount равна dataLayer Variable giftCount = 4 ? - person rorschaff; 11.12.2015
comment
Точно @rorschaff, но вам не нужно верить мне на слово, отладчик предварительного просмотра покажет вам, что вы добавили и как это влияет на эффективный слой данных и переменные для каждого сообщения. - person lossleader; 11.12.2015
comment
Я поверил тебе на слово. Я воссоздал свой первоначальный dataLayer.push() и настроил все последующие .push(), чтобы они следовали тому же порядку работы. GTM получает только самые последние переменные dataLayer. Исходя из фона базы данных, я беспокоился о злоупотреблении емкостью dataLayer, но, поскольку технически это временный пакет для каждой страницы, я думаю, что это не проблема. @lossleader Спасибо! - person rorschaff; 11.12.2015