[英]Ignore missing ancestor JSON object keys in JavaScript/ES6?
访问嵌套JSON对象键的值时,我们需要检查是否存在父键,以防止发生未定义的键错误。
鉴于这种:
var obj = {
aaa: {
bbb: {
ccc: {
ddd: 'ok'
}
}
}
};
// #1 cause error if any of the parent key is not defined (e.g. aaa, bbb, ccc)
const ddd = obj.aaa.bbb.ccc.ddd || 'none';
// #2 this works but lots of repetition
const ddd = obj.aaa && obj.aaa.bbb && obj.aaa.bbb.ccc && obj.aaa.bbb.ccc.ddd || 'none';
在上面的示例中,如果未定义aaa,bbb或ccc,则#1
将不起作用。
#2
有效,但是您会看到祖先键的重复。
问:是否有JavaScript / ES6语法可以简化此操作,还是我们需要编写/使用自定义函数?
您可以使用具有默认值的ES6解构来减轻一些负担:
const {
aaa: {
bbb: {
ccc: {
ddd = 'none'
} = {}
} = {}
} = {}
} = (obj || {});
一开始我当然觉得这很不直观。 这是细分的含义:
obj
,或者如果它是“ falsy”,则使用{}
。 aaa
属性,如果未定义,则获取{}
。 bbb
属性,如果未定义,则获取{}
。 ccc
属性,如果未定义,则获取{}
。 ddd
常量, ddd
分配ddd
属性的值;如果未定义,则为'none'
。 请注意,解构期间的默认值仅适用于未定义的值,不适用于null
等值; 如果要处理这些情况,则必须使用更传统的方法。
这是我经常用于JS默认设置的功能:
function defaultSetting(check,fallback,current)
{
if (!$.isArray(check)) {
if ($.type(check) === 'string' && check.length > 0) {
check = [check];
} else {
check = false;
}
}
if (false === check || check.length < 1) {
return false;
}
if (!current) {
current = window;
}
var checkThis = check.shift();
if (check.length > 0) {
if ((checkThis in current) && $.type(current[checkThis]) === 'object') {
return defaultSetting(check,fallback,current[checkThis]);
} else {
return fallback;
}
} else {
if (checkThis in current) {
return current[checkThis];
} else {
return fallback;
}
}
}
它实际上不是ES6代码,因此可以通过ES6语法进行一些改进。 它还将jQuery用于$ .isArray()和$ .type()方法,但是可以将这些行替换为typeof
调用。
在上面的示例中,您将其命名为ddd = defaultSetting(['aaa','bbb','ccc','ddd'],'none', obj);
您可以使用JSON.stringify()
, String.prototype.match()
var hasKey = !!(JSON.stringify(obj).match(/"ddd":/));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.