GTM自定义变量添加if逻辑后metric5返回undefined问题排查
问题原因
- 索引i未初始化就调用:你将品类判断、marginPrice计算的代码段放在了for循环外部,此时遍历索引
i还没有被赋值,调用orderItems[i]会直接返回undefined,导致代码抛出错误,最终GTM返回空结果。你之前直接在push对象时写orderItems[i].metric5可以正常运行,是因为这行代码位于for循环内部,i是遍历过程中有效的索引值。 - 多分支判断逻辑错误:你当前写的是两个独立的
if判断,第二个if对应的else分支会覆盖第一个if的赋值结果。比如当商品品类是Red Hoodie时,第一个if给marginPrice赋值后,第二个if判断不满足,会触发else分支,把marginPrice重新覆盖为orderItems[i].metric5,第一个判断逻辑完全失效。 - 额外注意:原有代码中
i、lineItems没有加声明关键字,会默认变成全局变量,存在污染全局作用域的风险。
修正后的完整代码
function() { var ecom = JSON.parse(JSON.stringify({{dlv_ecommerce}})); var orderItems = {{dlv_purchase_ecommerce.purchase.products}}; var convertFrom = {{dlv_purchase_ecommerce.currencyCode}}; var rates = {{dlv_rates}}; var n = orderItems.length; var lineItems = []; // 将marginPrice计算逻辑移入for循环内部 for (var i = 0; i < n; i++) { var eventItem = orderItems[i].category; var marginPrice; // 调整为if else if多分支结构,避免赋值覆盖 if(eventItem == "Red Hoodie"){ marginPrice = orderItems[i].price * 0.10; } else if(eventItem == "Blue T-Shirt"){ marginPrice = orderItems[i].price * 0.05; } else { marginPrice = orderItems[i].metric5; } lineItems.push({ "name": orderItems[i].name, "id": orderItems[i].id, "price": orderItems[i].price, "brand": orderItems[i].brand, "category": orderItems[i].category, "quantity": orderItems[i].quantity, "dimension2": orderItems[i].dimension2, "dimension8": orderItems[i].dimension8, "dimension9": orderItems[i].dimension9, "dimension10": orderItems[i].dimension10, "dimension11": orderItems[i].dimension11, "metric1": orderItems[i].metric1, "metric2": orderItems[i].metric2, "metric3": orderItems[i].metric3, "metric4": orderItems[i].metric4, "metric5": marginPrice / rates[convertFrom] }); }; var ecomAddProducts = { "products": lineItems, }; return {'ecommerce' : {'purchase' : {'products' : ecomAddProducts}}}; }
内容的提问来源于stack exchange,提问作者bledley
相关产品推荐
相关产品推荐

