【问题标题】:Ignore missing ancestor JSON object keys in JavaScript/ES6?忽略 JavaScript/ES6 中缺少的祖先 JSON 对象键?
【发布时间】:2016-03-02 01:05:16
【问题描述】:

在访问嵌套的 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 代理实现一些聪明的东西,但是 ES6 没有什么新东西,你应该使用现有的解决方案
  • 我不认为这是真正的重复。太糟糕了,我无法发布答案。使用默认解构会有所帮助,尽管语法需要一些时间来适应:const { aaa: { bbb: { ccc: { ddd = 'none' } = {} } = {} } = {} };
  • @Jacob:请将其发布为规范重复问题的答案。

标签: javascript json ecmascript-6


【解决方案1】:

您可以使用带有默认值的 ES6 解构来减轻一些负担:

const { 
  aaa: { 
    bbb: { 
      ccc: { 
        ddd = 'none' 
      } = {} 
    } = {} 
  } = {} 
} = (obj || {});

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

  1. 作为起始值,使用obj,或者如果它是“falsy”,则使用{}。
  2. 获取aaa 属性,如果未定义,则获取{}。
  3. 获取bbb 属性,如果未定义,则获取{}。
  4. 获取ccc 属性,如果未定义,则获取{}。
  5. 声明一个ddd 常量,分配ddd 属性的值,如果未定义,则为'none'。

请注意,解构过程中的默认值仅适用于未定义的值,不适用于null之类的值;如果要处理这些情况,则必须使用更传统的方法。

【讨论】:

    【解决方案2】:

    这是我经常用于 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);

    【讨论】:

      【解决方案3】:

      你可以使用JSON.stringify()、String.prototype.match()

      var hasKey = !!(JSON.stringify(obj).match(/"ddd":/));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-20
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 1970-01-01
        相关资源
        最近更新 更多