坚果大叔 坚果大叔
  • 首页
  • 闲言碎语
  • 技术
  • 生活
  • 记录
  • 朋友
  • 热点新闻
  • 常用代码
  • 工具箱
  • 关于
首页 › 技术 › 链式取值(转载整理)

链式取值(转载整理)

坚果大叔
2022-03-17 7:43:29技术阅读 3,150

实际开发的过程中,遇到取某个对象下的某个值,或者是未知对象下的某个属性的值。如果不确定这个值有没有怎么办?

res.data.money.list[0].price

比如上面这种,想获取data下面list数组的第一个的price的值。如果我们直接这样写,在money下没有list的时候就会报Uncaught TypeError: Cannot read property 'list' of undefined。之前是这样处理的。

if (res.data.money.list[0] && res.data.money.list[0].price) {

    // 实际业务逻辑部分

}

或者是更全的

if (
    res && 
    res.data && 
    res.data.money && 
    res.data.money.list && 
    res.data.money.list[0] && 
    res.data.money.list[0].price) {

    // 实际业务逻辑部分

}

可以看多如果层级更深这样写起来不是很优雅,所有就有了下面的方法。

1、通过babel插件 babel-plugin-transform-optional-chaining 来实现

a?.b                          
a == null ? undefined : a.b

a?.[x]                        
a == null ? undefined : a[x]

a?.b()                        
a == null ? undefined : a.b() 

a?.()                        
a == null ? undefined : a()  

2、通过函数解析字符串

// lodash的_.get方法

var object = { a: [{ b: { c: 3 } }] };

var result = _.get(object, 'a[0].b.c', 1);

3、使用解构赋值

const c = {a:{b: [1,2,3,4]}}

const { a: result } = c;
// result : {b: [1,2,3,4]}

cosnt {a: { c: result = 12 }} = c
// result: 12

4、使用Proxy

function pointer(obj, path = []) {
    return new Proxy({}, {
        get (target, property) {
            return pointer(obj, path.concat(property))
        },
        apply (target, self, args) {
            let val = obj;
            let parent;
            for(let i = 0; i < path.length; i++) {
                if(val === null || val === undefined) break;
                parent = val;
                val = val[path[i]]    
            }
            if(val === null || val === undefined) {
                val = args[0]
            }
            return val;
        }
    })
}

使用:

let c = {a: {b: [1, ,2 ,3]}}

pointer(c).a();   // {b: [1,2,3]}

pointer(c).a.b(); // [1,2,3]

pointer(d).a.b.d('default value');  

参考链接

如何优雅地链式取值 ?

JS 链式取值
赞赏 赞(1)
本文系作者 @坚果大叔 原创发布在 坚果大叔。未经许可,禁止转载。
胜利的曙光,就要来了
上一篇
利用yalc本地调试NPM组件库!
下一篇
在小程序中查看

评论已关闭

搜你想看的
聚合文章
js中的各种width,height
周五
亦如沙粒,亦如星辰,我平凡的2019!!
一点?记录。
闲言碎语
Memos
npm install 出现 Error:EISDIR:illegal operation on a directory 的错误提示!
2025-03-31 19:02:11
559 0 0
iphone 利用 Scriptable 添加网上国网电费小组件
2025-01-06 20:40:20
5,006 6 2
在博客中加上memos记录展示。
2024-12-25 23:41:27
2,333 5 2
网页点击平滑滚动效果~
2024-10-17 16:43:08
2,037 4
1
  • 1
博主

一位佛系的前端开发者,略通摄影,乐于尝试新事物,热衷于美食。

友链
故事胶片
公众号
坚果大叔 执行上下文 卖坚果的怪叔叔 Dacking
Copyright © 2017-2025 坚果大叔

开往-友链接力

萌ICP备20230818号

苏ICP备18048410号-3
  • 首页
  • 闲言碎语
  • 技术
  • 生活
  • 记录
  • 朋友
  • 热点新闻
  • 常用代码
  • 工具箱
  • 关于
# CSS # # JavaScript # # vue # # 微信 # # 生活 #
坚果大叔
317
文章
125
评论
365
喜欢