在前后分离的大背景下,前端数据渲染过程中,有时候后端返回的数据结构并不是前端需要的格式,如果后端不处理,这个时候就需要前端自己处理。

假如拿到的数据是这样的:

list:[{id: '01',name: 'saly',role: [{role_id: 1, name: "管理员", status: 1}],org: [{org_id: 1, name: "xx公司", parent_id: 0, status: 1, remark: ""}]},{id: '02',name: 'deay',role: [{role_id: 1, name: "管理员", status: 1}],org: [{org_id: 1, name: "xx公司", parent_id: 0, status: 1, remark: ""}]}]

但是这个不是你要的数据结构,想把对象里嵌套的数组全部的数据取出来加到一级对象上
需求:就是遍历所有对象,把对象里所有数组的属性和值取出来,加到对象上

转换之后的格式是这样的:

list:[{id: '01',name: 'saly',role_id: 1, role_name: "管理员",org_id: 1, org_name: "xx公司",parent_id: 0,status: 1,remark: ""},{id: '02',name: 'deay',role_id: 1, role_name: "管理员",org_id: 1, org_name: "xx公司",parent_id: 0,status: 1,remark: ""},]

简单版:

可以利用es6的赋值解构来处理,转换方法:

list.map(item => {const {role: [{ role_id, name: role_name } = {}],org: [{ org_id, name: org_name, ...otherOrg }],...other} = item;return {...other,role_id,role_name,org_id,org_name,...otherOrg}
})

详细版:

如果 roleorg 这两个数组都只有一层,那会比较好办:

1. 使用 IIFE 进行二级解构

const result = list.map(({ role, org, ...rest }) => ({...rest,...(({ role_id, name }) => ({ role_id, role_name: name }))(role[0]),...(({ org_id, name, parent_id }) => ({ org_id, org_name: name, parent_id }))(org[0]),
}));

或者直接在 map callback 的参数里完全解构出来:

2. 在参数里使用多级构

const result = list.map(({role: [{ role_id, name: role_name }],org: [{ org_id, name: org_name, parent_id }],...rest
}) => ({ ...rest, role_id, role_name, org_id, org_name, parent_id }));

如果 roleorg 可能是多个,那么问题来了……是需要做交叉展开吗?如果需要,那至少需要两层 flatMap

const result = list.flatMap(({ role, org, ...rest }) => {return role.flatMap(({ role_id, name: role_name }) => {return org.map(({ org_id, name: org_name, parent_id }) => ({...rest,role_id, role_name,org_id, org_name, parent_id}));});
});

Lambda 代码块里只有一句 return 的情况下,可以去掉 return,改为表达式(为了可读性,可以在 => 后面折行+缩进)

const result = list.flatMap(({ role, org, ...rest }) =>role.flatMap(({ role_id, name: role_name }) =>org.map(({ org_id, name: org_name, parent_id }) => ({...rest,role_id, role_name,org_id, org_name, parent_id})))
);

【数据格式转换】js如何将对象嵌套的数组数据取出来加到对象里,数据格式转换[{[],[]},{[],[]}] 转[{},{}]相关推荐

  1. js 快速找出两个数组中的不同元素或对象

    js 快速找出两个数组中的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1 ...

  2. JS案例——找出两个数组中的不同元素或对象、数组去重

    一.找出两个数组中的不同元素或对象 1. 数据 var arr1 = ["张瑞淑", "徐海涛", "谢岗岗", "薛鹏" ...

  3. 【ES6】es6数组中对象去重,数组对象去重方法总结---filter()与reduce()实践

    es6数组中对象去重 方法一: filter()与findIndex()给数组去重 1. filter()用法 2. findIndex()用法 3. 去重实战 方法二:reduce()去重 1. r ...

  4. js遍历多层嵌套对象存在的JSO数据

    js获取含有多层嵌套对象的JSON数据,主要应用迭代的思想. 该案例需要获取jsonData中的所有属性值. <!DOCTYPE> <html> <head>< ...

  5. 前端:JS/28/CSS DOM动态样式(style对象,style 对象属性与CSS属性的转换),Event DOM,事件对象简介(DOM和IE中的Event对象),实例:点出满天小星星

    CSS DOM动态样式 使用JS操作CSS中的各个属性: JS只能操作或修改行内样式,如:imgObjstyle.border = "1px solid red"; 对于类样式,通 ...

  6. 嵌套地狱_解决嵌套业务逻辑_使用Js的对象_避免数组嵌套---SpringCloud Alibaba_若依微服务框架改造_ElementUI---工作笔记016

    今天做个业务,有同事来问我,说有个业务,比如: 1.有建筑, 2.建筑中有几号楼, 3.几号楼中有几单元, 4.几单元中有几层, 5.几层中有几个房间 他要用个5维数组来做...最终,做到最后说,麻烦 ...

  7. java集合转js数值_前端js调用接口转换Map数组数据

    返回Map数据 后端接口返回数据格式 { "code": 1, "msg": "操作成功!", "count": 0, ...

  8. Java、JS解析JSON对象、JSON数组

    一:三种JSON格式 基本类型 {"student": "张三","age": 18,"sex": true } 数组类 ...

  9. JavaScript基础07-day09【嵌套for循环、break和continue、对象、数据类型、对象字面量、函数】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

最新文章

  1. windows 文件关联图标的设置方法 (附部分代码)
  2. java 下载二进制文件_使用Java从Github下载二进制文件
  3. SAP Spartacus CMSService 的调用栈以及 meta 标签的生成过程
  4. SIP应答消息状态码与功能
  5. 接口协作--apipost接口协作工具
  6. 为什么有人说:“离职见人品”?
  7. Ansible详解(二)——Ansible安装与命令
  8. linux 命令行下载BT种子和磁力链接 ubuntu linux 命令行下载种子
  9. vld/rdy协议 断言
  10. 【Shader入门精要】第十四章——卡通风格的渲染
  11. 中国神话--学术性研究
  12. 泛函分析在计算机科学中的应用,泛函分析在小波理论中的应用.doc
  13. 使用关键词快速搜索商品代码
  14. 龟兔赛跑编程c语言蓝桥,龟兔赛跑
  15. 新型材料集成墙面,到底“新”在哪里?
  16. 计算机软件定时运行,做一回达人 Windows7定时运行程序
  17. 上交所逐笔委托_[转载]上交所、深交所市价委托种类及含义
  18. 计算机病毒的基本知识
  19. 百度地图添加多个marker点位标注
  20. python爬取今日头条手机app广告_今日头条App广告采集器的实现

热门文章

  1. CSDN每日一练技巧
  2. Dapper——袖珍火箭映射器
  3. 医学影像中呼吸门控的动态显示
  4. Bean 依赖注入方式
  5. 2021年中国医药行业发展现状及重点企业对比分析[图]
  6. 微信火了之后不得不说的事情-微信公众号之服务号与订阅号的区别
  7. ios真机调试时需要添加的UDID是什么?怎么获取?
  8. c语言200例 016 水池注水问题
  9. 《计算机网络》学习总结——网络层的概念、IP协议与转发
  10. 广州国际车用空调展圆满落幕!旭派载誉而归,收货满满!