dai1988622
V2EX  ›  问与答

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

  •  
  •   dai1988622 · Oct 25, 2018 · 1037 views
    This topic created in 2755 days ago, the information mentioned may be changed or developed.

    比如一个多维数组 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  
       Oct 25, 2018
    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
       Oct 25, 2018
    @agagega 直接在自定义一个 dig 方法来完成这个事情嘛 大佬厉害
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1284 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 23:43 · PVG 07:43 · LAX 16:43 · JFK 19:43
    ♥ Do have faith in what you're doing.