为具有未定义值的嵌套对象设置默认值的最简单方法
Simplest way to set default values for nested object with undefined values
我有一个JSON字符串。我使用它通过其数据层将数据推送到谷歌跟踪代码管理器。示例:如果页面是联系人,那么我将 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 = "";
};
谢谢!
似乎您想尝试通过变量获取值。此外,变量来自具有级别的对象。
如果我是你,我会检查变量而不是"checkNested()"。
例:
function isEmpty(v, defValue) {
return (typeof (v) == 'undefined') ? defValue : v;
}
if( isEmpty(o.act.type, false) !== false ){
console.log( 'o.act.type: ' + o.act.type );
}
console.log( 'o.act.keyNotExists: ' + isEmpty(o.act.keyNotExists, 'default value') );
相关文章:
- jQuery Datepicker从日期开始设置默认值
- 在KeystoneJS中为Types.Money设置默认值
- 如何为显示jquery滑块值的文本框设置默认值
- 在Bootstrap下拉菜单中设置默认值
- 如何为 jquery 自动完成框设置默认值
- 聚合物:如何为具有嵌套特性的图纸选项卡设置默认值
- 使用复杂对象上的删除为选择框手动设置默认值
- 在动态输入数据的下拉菜单中设置默认值
- 有什么方法可以在超级测试中设置默认值吗
- 挖空 + 选择2 -- 设置默认值
- ||运算符在 null 时不设置默认值
- 如何在 Select2 输入中设置默认值,并在 asp.net mvc 中标记
- 在链接回以前访问过的页面时设置默认值
- PHP 设置默认值以从 ajax 页面返回记录
- 在文档加载时使用 JQuery 在下拉字段中设置默认值
- 如何为 Google 放置 API 自动完成文本框设置默认值
- 为具有未定义值的嵌套对象设置默认值的最简单方法
- AngularJS更新ng-model的值以设置默认值
- 剑道 UI 组合框 - 设置默认值
- JQuery 日期选取器设置默认值