忽略 JavaScript/ES6 中缺少的祖先 JSON 对象键

Ignore missing ancestor JSON object keys in JavaScript/ES6?

本文关键字:祖先 JSON 对象 JavaScript ES6 忽略      更新时间:2023-09-26

在访问嵌套 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属性的值,如果未定义,则'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":/));