如何改造新版JavaScript脚本为旧版以适配Google Tag Manager?
解决方案
以下是改造后兼容旧版JavaScript、可在Google Tag Manager中正常运行的完整脚本:
function getFromDataLayer(key) { var result = null; dataLayer.push(function() { var value = this.get(key); if (value) { result = value; } }); return result; }; var ecom = getFromDataLayer('ecommerce.purchase.products'); var filterValue = "Krups"; var filteredProducts = []; // 先校验数据合法性,避免后续方法调用报错 if (ecom && Array.isArray(ecom)) { filteredProducts = ecom.filter(function(val) { // 用indexOf替代ES6的includes,兼容旧环境 return val.brand && val.brand.indexOf(filterValue) !== -1; }); } // 用普通函数替代ES6箭头函数,移除解构赋值语法 return filteredProducts.reduce(function(total, product) { // 给parseInt指定基数10,避免意外进制解析 var priceNum = parseInt(product.price, 10); // 处理价格无效的情况,防止计算异常 return total + (isNaN(priceNum) ? 0 : priceNum); }, 0);
关键修改说明
- 修复Array.filter语法错误:原代码直接传入表达式而非回调函数,改为传入
function(val) { ... }的标准回调形式。 - 替换ES6字符串方法:旧版JS不支持
String.includes,改用indexOf(filterValue) !== -1判断字符串包含关系,同时增加val.brand存在性校验,避免属性不存在时报错。 - 移除ES6箭头函数与解构赋值:将
reduce中的箭头函数改为普通函数,把解构的{price}替换为传统的product.price属性访问方式。 - 增加异常防护逻辑:
- 校验
ecom是否存在且为数组,避免空值调用filter方法报错。 - 对
parseInt结果做isNaN判断,防止无效价格值干扰计算结果。 - 给
parseInt指定基数10,避免默认进制解析导致的数值错误。
- 校验
内容的提问来源于stack exchange,提问作者Matúš Rebroš
相关产品推荐
相关产品推荐

