当访问嵌套的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语法来简化此操作,或者我们需要编写/使用自定义函数?
答案 0 :(得分:1)
您可以使用带有默认值的ES6解构来减轻一些负担:
const {
aaa: {
bbb: {
ccc: {
ddd = 'none'
} = {}
} = {}
} = {}
} = (obj || {});
我一开始确实觉得这个不直观。这是分解的意思:
obj
,或者如果是“假”,{}
。aaa
属性,如果未定义,则获取{}
。bbb
属性,如果未定义,则获取{}
。ccc
属性,如果未定义,则获取{}
。ddd
常量,指定ddd
属性的值,如果未定义则声明'none'
。请注意,解构期间的默认值仅适用于未定义的值,而不适用于null
等值;如果你想处理这些情况,就必须使用更传统的方法。
答案 1 :(得分:0)
这是我经常用于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);
答案 2 :(得分:-1)
您可以使用JSON.stringify()
,String.prototype.match()
var hasKey = !!(JSON.stringify(obj).match(/"ddd":/));