【问题标题】:Pattern to avoid long dot-notation chains避免长点符号链的模式
【发布时间】:2019-02-11 02:58:05
【问题描述】:

当使用点表示法访问嵌套对象时,我总是必须确保前一个对象存在,这很累人。

我基本上想避免长链像

if (a && a.b && a.b.c && a.b.c[0] ... ) { v = a.b.c[0]; }

我能想到的唯一另一件事是使用 try catch。

var v; try { v = a.b.c[0].d.e; } catch (e) {}

有更好的模式吗?

【问题讨论】:

  • 我想到了一个递归函数... 思考
  • @tymeJV 我在这里看不到任何递归:)
  • 不可能在不引起异常的情况下预先询问 a.b(例如 a.b.c 抛出异常)。
  • 您通常应该避免串接这么多电话。创建一种方法来做你想做的事,而不是破坏火车c2.com/cgi/wiki?TrainWreck
  • @elimirks 问题是我在访问时别无选择,例如解码的 JSON 对象。这不是设计决定。

标签: javascript


【解决方案1】:

我认为你已经有了两个最漂亮的解决方案。

但请注意,对于obj.obj.string.length 之类的情况,如果string === "",您的第一个解决方案将失败。由于空字符串是错误的,它会触发&& 守卫。

但说到字符串,您可以执行以下操作:

function getNestedProperty(obj, propChain) {
    var props = propChain.slice(0), prop = props.shift();
    if(typeof obj[prop] !== "undefined") {
        if(props.length) {
            return getNestedProperty(obj[prop], props);
        } else {
            return obj[prop];
        }
    }
}

var v = getNestedProperty(a, ["b", "c", 0, "d", "e"]);

是的...不太漂亮:P

我想说,在提出的解决方案中,try...catch 可能是最简单的方法

【讨论】:

    【解决方案2】:

    这个怎么样:

    var hasProperty = function (object, property) {
    
        var properties = property.split('.'),
            temp = object;
    
        while (temp && properties.length) {
            temp = temp[properties.shift()];
        }
    
        return !!temp;
    };
    

    然后像这样使用它:

    if (a && hasProperty(a, 'b.c.0' ) { v = a.b.c[0]; }
    

    【讨论】:

      【解决方案3】:

      您在问题中提到的场景也称为“可选链接”。一些语言现在已经支持它——例如 C# 有所谓的null-conditional operators,它允许你短路你的表达式:

      var count = customers?[0]?.Orders?.Count();
      

      很遗憾,这个特性还没有成为当前的 JS 规范。

      有一个开放的Stage 1 提议用于“可选链接”,可以跟踪here

      这样你就可以写...

      a?.b[3].c?.(x).d
      

      ...而不是:

      a == null ? undefined : a.b[3].c == null ? undefined : a.b[3].c(x).d
      

      如果您想冒险并在这个早期阶段就已经使用它,您可以target it via babel 将其包含在您的项目中。

      【讨论】:

        【解决方案4】:

        这是相当邪恶的,但这应该有效并且看起来不太可怕:

        var i = !a ? null : !a.b ? null : !a.b.c ? null : !a.b.c.d ? a.b.c.d.e;
        

        ! 的原因是反转测试标志,以允许成功案例成为?: 中的最后一个表达式。这使我们可以像这样将它们链接在一起。

        检查运算符的优先级,如果你想真正做到这一点(我做了一些非常基本的测试,我认为我做对了)。 确实希望人们在您的代码中看到它时会指指点点并大笑。

        【讨论】:

          猜你喜欢
          • 2023-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-24
          • 1970-01-01
          相关资源
          最近更新 更多