繁体   English   中英

忽略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 || {});

一开始我当然觉得这很不直观。 这是细分的含义:

  1. 作为初始值,请使用obj ,或者如果它是“ falsy”,则使用{}
  2. 获取aaa属性,如果未定义,则获取{}
  3. 获取bbb属性,如果未定义,则获取{}
  4. 获取ccc属性,如果未定义,则获取{}
  5. 声明一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM