Dati e stato calcolato

Adobe Client Data Layer (ACDL) unisce ogni oggetto dati inviato in un singolo oggetto denominato stato calcolato. Qualsiasi script può leggere lo stato calcolato in qualsiasi momento con getState(). Puoi inviare tutti i dati contemporaneamente o in molti piccoli messaggi push da script diversi. Lo stato calcolato è lo stesso in entrambi i casi.

window.adobeDataLayer = window.adobeDataLayer || [];
window.adobeDataLayer.push({ page: { title: "Getting started" } });
window.adobeDataLayer.push({ component: { "hero-1": { title: "Learn more", link: "learn-more.html" } } });
window.adobeDataLayer.push({ page: { language: "en" } });

Dopo questi push, adobeDataLayer.getState() restituisce il seguente oggetto:

{
  "page": {
    "title": "Getting started",
    "language": "en"
  },
  "component": {
    "hero-1": {
      "title": "Learn more",
      "link": "learn-more.html"
    }
  }
}

Anche gli oggetti evento possono contenere dati. ACDL unisce ogni chiave in un oggetto evento ad eccezione di event e eventInfo, che non vengono mai archiviati nello stato calcolato. Vedi Eventi.

Regole di unione merge-rules

Quando si inviano i dati, ACDL confronta ogni chiave nell’oggetto inviato con lo stato calcolato:

Valore inviato
Risultato nello stato calcolato
Chiave che non esiste nello stato calcolato
Aggiunge la chiave e il relativo valore.
Un oggetto, in cui lo stato calcolato contiene anche un oggetto
Unisce i due oggetti. Le chiavi che non vengono inviate mantengono i valori correnti. Questa regola si applica a ogni livello di nidificazione.
Stringa, numero o valore booleano
Sostituisce il valore corrente.
Un array
Sostituisce il valore corrente. Vedi Array.
null o undefined
Elimina la chiave. Vedi Elimina dati.

Ad esempio, il secondo push seguente cambia solo page.title. La chiave page.language mantiene il valore:

adobeDataLayer.push({ page: { title: "Home", language: "en" } });
adobeDataLayer.push({ page: { title: "Products" } });
adobeDataLayer.getState("page");
// { title: "Products", language: "en" }

Elimina dati delete

Per eliminare una chiave, invia null o undefined come valore:

adobeDataLayer.push({ page: { title: "Products", language: "en" }, user: { id: "123" } });
adobeDataLayer.push({ page: { language: null }, user: null });
adobeDataLayer.getState();
// { page: { title: "Products" } }

L’eliminazione dell’ultima chiave all’interno di un oggetto lascia un oggetto vuoto. Per eliminare anche l’oggetto, invia null per l’oggetto stesso.

adobeDataLayer.push({ page: { title: null } });
adobeDataLayer.getState();
// { page: {} }

I listener che utilizzano l’opzione path vengono chiamati quando si elimina la chiave nel percorso specificato o in qualsiasi oggetto che la contiene.

Array arrays

Un array viene memorizzato come valore singolo. Quando si preme un array su una chiave che contiene già un array, ACDL sostituisce l’intero array. Per aggiungere un elemento, premi l’array completo con il nuovo elemento:

adobeDataLayer.push({ cart: { skus: ["a-100", "b-200"] } });
adobeDataLayer.push({ cart: { skus: ["a-100", "b-200", "c-300"] } });
adobeDataLayer.getState("cart.skus");
// ["a-100", "b-200", "c-300"]

ACDL rimuove null e undefined voci dagli array inviati:

adobeDataLayer.push({ cart: { skus: ["a-100", null, "c-300"] } });
adobeDataLayer.getState("cart.skus");
// ["a-100", "c-300"]
NOTE
ACDL 2.x unisce gli array per posizione anziché sostituirli. In 2.x, se si preme ["c"] su ["a", "b"] si ottiene ["c", "b"]. Per ottenere lo stesso risultato in entrambe le versioni, invia sempre l’array completo.

Modificare il tipo di un valore change-type

È possibile sostituire un oggetto con una stringa, un numero, un valore booleano o una matrice. Tuttavia, in ACDL 3.x, il push di un oggetto a una chiave che al momento contiene una stringa, un numero, un valore booleano o un array non sostituisce il valore. Se il valore corrente è 0, false o una stringa vuota, la chiave viene eliminata.

Per modificare un valore in un oggetto, elimina prima la chiave, quindi invia l’oggetto:

adobeDataLayer.push({ product: "a-100" });
adobeDataLayer.push({ product: null });
adobeDataLayer.push({ product: { sku: "a-100", price: 25 } });
adobeDataLayer.getState("product");
// { sku: "a-100", price: 25 }

Il modo migliore per evitare questa situazione è mantenere coerente il tipo di ogni chiave nella progettazione del livello dati.

Tipi di valore value-types

Utilizza valori compatibili con JSON nel livello dati: stringhe, numeri, booleani, null, oggetti semplici e array. ACDL converte altri tipi di oggetti durante l’unione:

Valore
Memorizzato come
Date oggetto
Oggetto vuoto ({}). Memorizzare le date come stringhe, ad esempio new Date().toISOString(), o come numeri.
Funzione
Oggetto vuoto ({}).
Map o Set
Oggetto vuoto ({}).
Istanza di una classe
Oggetto semplice che contiene solo le proprietà enumerabili dell’istanza.
Oggetti vuoti, array vuoti, stringhe vuote, 0 e false
Memorizzato così com’è.

Effettua il push solo di oggetti semplici. ACDL rifiuta altri valori, come stringhe, numeri e array, quando li si invia direttamente. Vedere push().

Copie, non riferimenti copies

Lo stato calcolato è indipendente dagli oggetti inviati. La modifica di un oggetto dopo il push non modifica lo stato calcolato:

const page = { title: "Home" };
adobeDataLayer.push({ page: page });
page.title = "Changed";
adobeDataLayer.getState("page.title");
// "Home"

Analogamente, getState() restituisce una copia. La modifica dell’oggetto restituito non modifica il livello dati. Per modificare lo stato calcolato, invia sempre la modifica.

recommendation-more-help
experience-platform-help-collection