我有一个 JSON 字符串。我使用它通过它的 dataLayer 将数据推送到谷歌标签管理器。示例:如果页面是联系方式,那么我会将 hitDetails 中的所有内容作为嵌套变量推送。
var dataLayerRepo = {
'/contact': {'hitDetails': {'act': {'type': 'views'}, 'dirObj': {'name': '/contact-us','type': '/page','id': window.location.search+window.location.hash}} },
'/': {'hitDetails': {'act': {'type': 'views'}, 'dirObj': {'name': '/homepage','type': '/page','id': window.location.search+window.location.hash,'class': {'lev0': '/booking-process'}}} },
};
我的问题是,对于某些页面,我在 hitDetails 中有其他字段不存在的字段(例如 class 和 class.lev0)。我可以让 JSON 本身中的字段具有空白值,但我想保持代码膨胀并且只推送具有值的字段。
所以我使用这个函数来检查嵌套级别,但它看起来很混乱和麻烦。
我不擅长 JS,但是有没有一种更简单的方式来表示“无论您尝试在 {{hitDetails}} (GTM 中的变量)中访问的嵌套值,如果它不存在就返回一个空字符串”。
var o = {{hitDetails}};
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments),
obj = args.shift();
for (var i = 0; i < args.length; i++) {
if (!obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
if (checkNested(o, 'act') == false) {
o.act = [];
};
if (checkNested(o, 'act','type') == false) {
o.dirObj.act.type = "";
};
谢谢!