忽略 JavaScript/ES6 中缺少的祖先 JSON 对象键
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
属性的值,如果未定义,则'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":/));
相关文章:
- jQuery匹配JSON对象的部分文本
- 在循环中分配json值时,值被覆盖
- 需要帮助设置json数组
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用JQuery解析JSON嵌套数组
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 如何使用json将对象列表从java转换为javascript
- 如何使用 node.js 比较两个 json 数组
- 如何将JSON数据导入我的ejs模板
- 区分JSON中的矩阵和列表列表
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何将json数据显示为html
- 如何为json对象中的段发送array[]
- 根据id将json数组组合为一个json数组
- Json数据包含日期和时间格式
- AngularJS-在JSON选择器中使用变量名
- 忽略 JavaScript/ES6 中缺少的祖先 JSON 对象键