V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dai1988622
V2EX  ›  问与答

怎么判断多层节点的某个元素是否定义,以 js 为例

  •  
  •   dai1988622 · 2018-10-25 11:48:43 +08:00 · 730 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如一个多维数组 data.goods.info.name 现在的业务是 这个 name 定义 并且存在 就显示名字 否则不显示

    然后 这个 data 数组是后端接口给过来的,从 data 开始 后面的节点都不一定存在的

    那么首先我不能直接这么写 if(data.goods.info.name){ // } 因为 比如 data.goods 这个节点不存在 这个 js 就报错了

    而是需要如下写法 if(data && data.goods && data.goods.info && data.goods.info.name){ // }

    但这么写太繁琐了 有没简单写写法

    换做其他语言 比如 php 直接判断 data.goods.info.name 虽然不报 err 级别错误 但是也有 warm 也是不合理的

    agagega
        1
    agagega  
       2018-10-25 12:51:38 +08:00
    Ruby 里面的键值对有个实例方法叫 dig,比如 data.dig('goods', 'info', 'name'),只要中间哪一步为空了,整个就直接返回空。你也可以写个类似的方法。

    有些语言里好像有类似 ?. 这样的运算符,如果操作对象是空的话结果也是空。

    类似这样:
    ```javascript
    Object.prototype.dig = function() {
    let obj = this
    for (let i = 0; i < arguments.length; ++i) {
    let next = obj[arguments[i]]
    if (i === arguments.length - 1 && typeof next !== 'undefined'
    || next !== null && typeof next === 'object') {
    obj = next
    } else {
    return null
    }
    }
    return obj
    }
    ```
    dai1988622
        2
    dai1988622  
    OP
       2018-10-25 13:23:19 +08:00
    @agagega 直接在自定义一个 dig 方法来完成这个事情嘛 大佬厉害
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.