Données et état calculé

La couche de données client Adobe (ACDL) fusionne chaque objet de données que vous poussez dans un seul objet appelé état calculé. Tout script peut lire l’état calculé à tout moment avec getState(). Vous pouvez transmettre toutes vos données en une seule fois ou dans de nombreuses petites transmissions à partir de différents scripts. L’état calculé est le même dans les deux cas.

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" } });

Après ces notifications push, adobeDataLayer.getState() renvoie l’objet suivant :

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

Les objets Événement peuvent également transporter des données. L’ACDL fusionne chaque clé d’un objet événement, à l’exception de event et eventInfo, qui ne sont jamais stockés à l’état calculé. Voir Événements.

Règles de fusion merge-rules

Lorsque vous poussez des données, ACDL compare chaque clé de l’objet poussé à l’état calculé :

Valeur transmise
Résultat dans l’état calculé
Une clé qui n’existe pas à l’état calculé
Ajoute la clé et sa valeur.
Objet , où l’état calculé contient également un objet .
Fusionne les deux objets. Les clés que vous ne poussez pas conservent leurs valeurs actuelles. Cette règle s’applique à tous les niveaux d’imbrication.
Chaîne, nombre ou valeur booléenne
Remplace la valeur actuelle.
Un tableau
Remplace la valeur actuelle. Voir Tableaux.
null ou undefined.
Supprime la clé. Voir Supprimer les données.

Par exemple, la deuxième notification push ci-dessous modifie uniquement page.title. La clé page.language conserve sa valeur :

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

Supprimer les données delete

Pour supprimer une clé, appuyez sur null ou undefined comme valeur :

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

La suppression de la dernière clé dans un objet laisse un objet vide. Pour supprimer également l’objet , appuyez sur null pour l’objet lui-même.

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

Les listeners qui utilisent l’option path sont appelés lorsque vous supprimez la clé de ce chemin d’accès ou de tout objet qui la contient.

Tableaux arrays

Un tableau est stocké en tant que valeur unique. Lorsque vous poussez un tableau vers une clé qui en contient déjà un, ACDL remplace l’ensemble du tableau. Pour ajouter un élément, poussez le tableau complet avec le nouvel élément :

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 supprime les entrées null et undefined des tableaux que vous poussez :

adobeDataLayer.push({ cart: { skus: ["a-100", null, "c-300"] } });
adobeDataLayer.getState("cart.skus");
// ["a-100", "c-300"]
NOTE
ACDL 2.x fusionne les tableaux par position au lieu de les remplacer. Dans la version 2.x, transmettre ["c"] sur ["a", "b"] entraîne ["c", "b"]. Pour obtenir le même résultat dans les deux versions, utilisez toujours le tableau complet.

Modification du type d’une valeur change-type

Vous pouvez remplacer un objet par une chaîne, un nombre, une valeur booléenne ou un tableau. Cependant, dans ACDL 3.x, le fait de pousser un objet vers une clé qui contient actuellement une chaîne, un nombre, une valeur booléenne ou un tableau ne remplace pas la valeur. Si la valeur actuelle est 0, false ou une chaîne vide, la clé est supprimée à la place.

Pour modifier une valeur en objet, supprimez d’abord la clé, puis appuyez sur l’objet :

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 }

La meilleure façon d’éviter cette situation est de conserver la cohérence du type de chaque clé dans la conception de votre couche de données.

Types de valeur value-types

Utilisez des valeurs compatibles JSON dans la couche de données : chaînes, nombres, booléens, null, objets simples et tableaux. ACDL convertit d’autres types d’objets lors de leur fusion :

Valeur
Stocké en tant que
Date objet
Un objet vide ({}). Stocker les dates sous forme de chaînes, telles que new Date().toISOString(), ou de nombres.
Fonction
Un objet vide ({}).
Map ou Set.
Un objet vide ({}).
Une instance d’une classe
Objet brut contenant uniquement les propriétés énumérables propres à l’instance.
Objets vides, tableaux vides, chaînes vides, 0 et false
Stocké tel quel.

Intégrez uniquement les objets simples. L’ACDL rejette d’autres valeurs, telles que des chaînes, des nombres et des tableaux, lorsque vous les poussez directement. Voir push().

Copies, et non références copies

L’état calculé est indépendant des objets que vous poussez. La modification d’un objet après l’avoir poussé ne modifie pas l’état calculé :

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

De même, getState() renvoie une copie. La modification de l’objet renvoyé ne modifie pas la couche de données. Pour modifier l’état calculé, effectuez toujours la modification.

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