【问题标题】:How to check for falsy values in properties of a chain of connected objects?如何检查连接对象链的属性中的虚假值?
【发布时间】:2021-07-04 15:19:21
【问题描述】:

我正在使用Logical OR (||) operator 来检查和分配值,如果它们不符合以下方式:

let locationDistrict =
                    result.results[0].address_components[2].long_name ||
                    result.results[0].address_components[1].long_name ||
                    result.results[0].address_components[0].long_name ||
                    'unknown district';

但是当resultresult.resultsresult.results[0]address_components 未定义时,我收到以下错误:

Uncaught TypeError: Cannot read property [name_of_property] of undefined

我尝试使用Optional chaining (?.) operator 访问属性来修复此问题,如下所示:

let locationDistrict =
                    result?.results[0]?.address_components[2]?.long_name ||
                    result?.results[0]?.address_components[1]?.long_name ||
                    result?.results[0]?.address_components[0]?.long_name ||
                    'unknown district';

但它仍然无法分配默认值“未知区”。

我可以通过使用Conditional (ternary) operator 并检查以下虚假值来使代码正常工作:

let locationDistrict =
                    (result && result.results && result.results[0] && result.results[0].address_components[2]) ? result.results[0].address_components[2].long_name :
                    (result && result.results && result.results[0] && result.results[0].address_components[1]) ? result.results[0].address_components[1].long_name :
                    (result && result.results && result.results[0] && result.results[0].address_components[0]) ? result.results[0].address_components[0].long_name :
                    'unknown district';

但我确信有更好、更优雅的方法来做到这一点。

为什么|| 运算符在其中任何一个链接对象未定义时不获取表达式的“未定义”值?当左侧操作数包含位于连接对象链中的深层属性时,我应该如何使用 || 运算符检查虚假值?

【问题讨论】:

  • 您还需要在[0] 之前使用?.。哦,还有 address_components 索引。
  • 更好的方法是将_.get(result, 'results[0].address_components') 的存储结果组合到某个临时变量中,然后继续访问其[0], [1], [2], ... 属性。不过,您还不清楚为什么还要处理如此复杂的数据结构。

标签: javascript


【解决方案1】:

这就是你要找的吗?

let result = {};

let locationDistrict =
                    result?.results?.[0]?.address_components?.[2].long_name ||
                    result?.results?.[0]?.address_components?.[1].long_name ||
                    result?.results?.[0]?.address_components?.[0].long_name ||
                    'unknown district';

console.log(locationDistrict)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多