obj类型属性取值,属性嵌套取值,为空且不存在安全取值方法

我们业务场景经常会有后台返回数据,然后从数据里面取属性值,es6有了默认值之后,可以直接数据取值,取不到或者没有直接返回的是默认值

抽空时间封装了一个取值的方法:

   /**
    * {}类型属性取值,属性嵌套取值,为空且不存在安全取值方法
    * @param {obj} obj           [要从取值的对象]
    * @param {string} props      [要从对象中取的属性名]
    * @param {*} defaultValue    [属性的默认值]
    */
   safeData (obj, props, defaultValue) {
    if (!obj) { // 如果没有返回数据,直接展示默认值
        return defaultValue;
    }
    if (typeof (obj[props]) !== ‘undefined‘) { // 数据单层,typeof (undefined) = ‘undefined‘
        if (obj[props] === null ) {
            return defaultValue;
        }
        return obj[props];
    }
    // 数据多层嵌套
    let propsArr = props.split(‘.‘); // 多层分割成数组
    // 循环一层一层取
    for (let i = 0, l = propsArr.length; i < l; i++) {
        let k = propsArr[i];
        if (obj && typeof obj === ‘object‘ && k in obj && (obj[k] !== null)) {
            obj = obj[k]; // obj重新赋值为新的一层
        } else {
            return defaultValue;
        }
    }
    return obj;
   }

测试下如下数据结构:

const data = {
  code: ‘FTH001‘,
  constructorCation: {
    company: ‘锅巴工作室‘,
    name: {
      lastname: ‘锅巴‘,
      firstname: ‘杨‘
    }
  }
};

分别嵌套取值:

            <div>
                <h6>公司编码:{safeData(data, ‘code‘, ‘‘)}</h6>
                <h6>公司名称:{safeData(data, ‘constructorCation.company‘, ‘‘)}</h6>
                <h6>公司法人:{safeData(data, ‘constructorCation.name.firstname‘, ‘‘)}{safeData(data, ‘constructorCation.name.lastname‘, ‘‘)}</h6>
            </div>

输出:

以后就不用每次都判断是不是存在值了。直接调用取之传名称就行了。

原文地址:https://www.cnblogs.com/yxfboke/p/10880580.html

时间: 2024-12-26 10:58:09

obj类型属性取值,属性嵌套取值,为空且不存在安全取值方法的相关文章

java获取对象属性类型、属性名称、属性值

因为项目需要用到,于是简单封装了一些常用的操作: [java] view plaincopy /** * 根据属性名获取属性值 * */ private Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + field

PHP.38-TP框架商城应用实例-后台15-商品属性与库存量1-不同商品(唯一属性、可选属性),属性类型

思路: 1.不同商品属于不同的类型,如:手机.服装.电脑等类型 2.不同的类型有不同的属性,其中分为唯一属性和可选属性,如服装:可选属性{尺寸:S,M,L--;颜色:白色,黑色--}唯一属性:材质 首先把类型与属性关联起来 1.建表 类型表{p39_type} drop table if exists p39_type; create table p39_type ( id mediumint unsigned not null auto_increment comment 'Id', type

(19)ASP.NET Core EF创建模型(包含属性和排除属性、主键、生成的值)

1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方法,这两种方法是用来配置EF在映射属性时绕开约定.Code first fluent API最常访问通过重写OnModelCreating方法在派生DbContext. 2.包含属性和排除属性 按照约定,数据模型中都包含一个getter和一个setter公共属性. 2.1包含属性 包含属性官网解释有点难以理解,我

SQL反模式学习笔记6 支持可变属性【实体-属性-值】

2014-10-11 17:21:31 目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需要新增列.不会影响现有表的结构: (3)存储的字段内容不会为空值. 缺点:(1)查询语句变得更加复杂: (2)使用EAV设计后,需要放弃传统的数据库设计所带来的方便之处,比如:无法保障数据完整性: (3)无法使用SQL的数据类型,比如对日期.金钱等格式内容都只

Dom解析xml,只是简单的解析出有效元素的元素名,元素值,属性名和属性值

DOM使用简单,但只适合于一些小的Xml文档,因为Dom解析Xml文档时,要将其读入内存,生成DOM树. 具体操作方法如下 要解析的XML文档 <persons> <person id="1001"> <name><![CDATA[<>上上</>]]></name> <!-- <![CDATA[<>上上</>]]> 预定义字符3. --> <sex&

Python通过lxml库遍历xml通过xpath查询(标签,属性名称,属性值,标签对属性)

xml实例: 版本一: <?xml version="1.0" encoding="UTF-8"?><country name="chain"><provinces><heilongjiang name="citys"><haerbin/><daqing/></heilongjiang><guangdong name="city

JS-窗体对象 与 事件返回值属性

窗体对象 //窗体的加载事件 () window.onload=function(){} //当整个页面加载完毕以后再执行窗体加载事件 //窗体的卸载事件 window.onunload=function(){} //当前窗体加载其他页面时,当前页面会被卸载触发onunload //窗体的获得焦点事件 window.onfocus=function(){} //从其他页面跳转到当前页面会触发onfocus事件 //窗体的失去焦点事件 window.onblur=function(){} //从当

AngularJS的ng-repeat显示属性名和属性值

代码下载:https://files.cnblogs.com/files/xiandedanteng/AngularJSAuthorRepeat.rar 代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html ng-app="notesApp"> <

《Entity Framework 6 Recipes》中文翻译系列 (25) ------ 第五章 加载实体和导航属性之加载完整的对象图和派生类型上的导航属性

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-5  加载完整的对象图 问题 你有一个包含许多关联实体的模型,你想在一次查询中,加载完整的对象图实例.一般地,当一个页面视图需要呈现关联实体集时,你会选择这种方法,而不是延迟加载,因为延迟加载是通过一系列的短小查询来获取关联实体的. 解决方案 假设你有如图5-20所示的概念模型.每门课程有很多节,每一节由一个老师教多名学习. 图5-20 一个包含许多关联实体的模型 使用Include()