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

2018-10-25 11:48:43 +08:00
 dai1988622

比如一个多维数组 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 也是不合理的

719 次点击
所在节点    问与答
2 条回复
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
2018-10-25 13:23:19 +08:00
@agagega 直接在自定义一个 dig 方法来完成这个事情嘛 大佬厉害

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/500982

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX