如何在 GTM 中使用 javascript 替换数据层中的参数名称

How can I replace parameter names in the dataLayer using javascript in GTM

我有一个数组,其中包含我从 dataLayer 提取到 GTM 中的电子商务订单信息。我已将此订单信息定义为一个变量,我想将其传递给支付完成事件的 TikTok 像素。

我面临的问题是 TikTok 像素期望键名“id”被称为“content_id”,键名“name”被称为“content_name”。我知道可以在 GTM 中使用自定义 Javascript 变量执行搜索和替换,然后将编辑后的数组发送到像素。但我无法弄清楚如何使用 JavaScript 进行搜索和替换部分。这是我正在使用的,这是我的变量中的内容:

[
  {
    id: "JBLANC015",
    name: "Blanc Diffuser, Maldivian Breeze",
    category: "Diffusers",
    price: "29.90",
    quantity: "3"
  },
  {
    id: "CH-AH-SHK-GREEN",
    name: "Hand Gesture Candle, Shaka  Green",
    category: "Candles",
    price: "39.90",
    quantity: "1"
  }
]

这只是一个示例,数组可能包含更多或更少的产品,所有“id”和“name”实例都需要替换为像素能够识别的正确值。

这是一个 extra-explanatory screencast video 以防万一。

我试过这个:

function(){
   var str = {{my array variable}};
   return str.replace("id", "content_id");
}

但是没有成功。

编辑。在理解了处理字符串和数组之间的区别之后,我得到了这样的东西,它可以一次更改一个键:

function(){
var products = 
[
  {
    name: "Hand Gesture Candle, Shaka  Green",
    id: "21834",
    price: "39.900000",
    brand: "Candlehand",
    category: "Candles"
  }
]
;
products.forEach(function(obj) {
  obj.content_name = obj.name;
  delete obj.name;
});
return products;
}

这可以完成工作,但当我插入一个直接拉动数组并从网站上运行的变量时却不行。

function(){
var products = {{my array variable}};
products.forEach(function(obj) {
  obj.content_name = obj.name;
  delete obj.name;
});
return products;
}

当我将上面看到的这个版本与变量一起使用时,“名称”键被删除,并且我没有在返回的数据中得到更改的“content_name”键。毫无疑问,一些简单的事情让我无法理解。

这里有一个类似的问题 Google Tag Manager > dataLayer variable find and replace with javascript variable 但无法获得对我有用的建议答案或从中提取有效的解决方案。

如有任何帮助,我们将不胜感激。

写一个新数组

str.replace 是字符串而不是数组的 replace 函数。此处您正在处理数组中的对象。
您不能只是猜测一个可以工作的函数,然后在这里提出问题。请查看文档并找到 JavaScript 教程如何使用字符串、对象和数组。
文档中已经包含了您可以学习的示例。

以下是 JavaScript 文档的一些链接:

一个易于理解的解决方案是创建一个新数组。
遍历数组中的每个对象和对象中的每个 属性 并从中创建一个新对象。没有必要花哨。如果需要,只需使用一两个循环即可。
请参阅下面的工作片段。

示例代码

let arr = [
  {
    id: "JBLANC015",
    name: "Blanc Diffuser, Maldivian Breeze",
    category: "Diffusers",
    price: "29.90",
    quantity: "3"
  },
  {
    id: "CH-AH-SHK-GREEN",
    name: "Hand Gesture Candle, Shaka  Green",
    category: "Candles",
    price: "39.90",
    quantity: "1"
  }
];

let trackingArray = [];
for(var i=0; i<arr.length; i++) {
  let obj = {};
  for(var k in arr[i]) {
    switch(k) {
      case "id":
        obj.content_id = arr[i][k];
        break;
      case "name":
        obj.content_name = arr[i][k];
        break;
      default:
        obj[k] = arr[i][k];
        break;
    }
  }
  
  console.log(obj);
  trackingArray.push(obj);
}

正如我所讨论的那样,我 post 这是对您更新后的问题的新答案。

我也试过 delete,但正如您所体验的那样,它也会删除分配的值。

但您也可以创建一个新数组,其中 returns 更改的产品:

function(){
  var products = 
  [
    {
      name: "Hand Gesture Candle, Shaka  Green",
      id: "21834",
      price: "39.900000",
      brand: "Candlehand",
      category: "Candles"
    }
  ];
  
  var changes = [];
  products.forEach(function(obj) {
    var product = {
      content_id: obj.id,
      content_name: obj.name,
      price: obj.price,
      brand: obj.brand,
      category: obj.category
    };
    changes.push(product);
  });
  return changes;
}

我在另一个答案中的错误是使用 let。我们应该改用 var,因为 let 是最近的。

关于未来,请阅读 how much research is expected of you 此处的 SO。期望是您不会尝试一次,失败后立即去问。您知道您必须学习 JavaScript,因此请查看教程和文档。
初学者的问题很好,但你必须证明你已经完成了自己的工作才能达到这一点。

请参阅下文以快速演示上述代码(添加了 console.log() 调用)。

(function(){
  var products = 
  [
    {
      name: "Hand Gesture Candle, Shaka  Green",
      id: "21834",
      price: "39.900000",
      brand: "Candlehand",
      category: "Candles"
    }
  ]
  ;
  var changes = [];
  products.forEach(function(obj) {
    var product = {
      content_id: obj.id,
      content_name: obj.name,
      price: obj.price,
      brand: obj.brand,
      category: obj.category
    };
    console.log(product);
    changes.push(product);
  });
  return changes;
})();