数据扁平化与反扁平化
个人理解
数据扁平化:将嵌套多层的数据转换成嵌套一层的数据;
数据反扁平化:将一层的数据转换成类似树结构的数据;
话不多说,直接上代码:
数据扁平化
方法一: 利用原型的isPrototypeOf()方法,用来检测一个对象是否存在于另一个对象的原型链中,如果存在就返回 true,否则就返回false;
let arr = [1,2,[3,4,5,[6,7,8,9]]]
let newArr = []
function fn(arr) {arr.forEach(item => {Array.prototype.isPrototypeOf(item) ? fn(item) : newArr.push(item)})return newArr
}
console.log(fn(arr))
// 运行结果: [1,2,3,4,5,6,7,8,9]
方法二: 使用Array.prototype.flat()方法,该方法创建一个新的数组,其中所有子数组元素以递归方式连接到指定的深度;
语法: arr.flat(depth)
arr:需要展平的数组
depth:可选参数,指定嵌套数组结构展平的深度级别,默认为1
let arr = [1,2,[3,4,5,[6,7,8,9]]]
console.log(arr.flat()) // [ 1, 2, 3, 4, 5, [ 6, 7, 8, 9 ] ]
console.log(arr.flat(1)) // [ 1, 2, 3, 4, 5, [ 6, 7, 8, 9 ] ] # 可以看出默认深度为1
console.log(arr.flat(2)) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(arr.flat(4)) // 当参数深度大于数组嵌套的层数,
// 默认也是将数组展平 [1, 2, 3, 4, 5, 6, 7, 8, 9]
方法三: 使用reduce处理
let arr = [ [0, 1], [2, 3], [4, [5, 6, 7]]]
function fn(arr) {return arr.reduce((pre,cur) => {return pre.concat(Array.isArray(cur) ? fn(cur) : cur)},[])
}
console.log(fn(arr)) // [0,1,2,3,4,5,6,7]
方法四: 运用toString()、split() 及toString()三个语法来进行扁平化数据。(缺陷:string类型的数字被转换成number类型了)
let arr = [[0,1], [2, 3], [4, 5, 'q', 'w', 'e', 'r'] ]
let newArr = []
newArr = arr.toString().split(',').map(item => {if(Number(item).toString() === 'NaN') return itemreturn Number(item)
})
console.log(newArr)
常见的树形结构数据案例:
let tree = [{id: 1,name: "1",pid: 0,children: [{id: 2,name: "2",pid: 1,children: []},{id: 3,name: "3",pid: 1,children: [{id: 4,name: "4",pid: 3,children: []}]}]}]function treeToArray(tree) {return tree.reduce((res, item) => {const { children, ...i } = itemreturn res.concat(i, children && children.length ? treeToArray(children) : [])}, [])}console.log(treeToArray(tree))// [// {id: 1, name: '1', pid: 0},// {id: 2, name: '2', pid: 1},// {id: 3, name: '3', pid: 1},// {id: 4, name: '4', pid: 3}// ]
反扁平化
let tree = [{id: 1, name: '1', pid: 0},{id: 2, name: '2', pid: 1},{id: 3, name: '3', pid: 1},{id: 4, name: '4', pid: 3}]function fn(tree) {let tree1 = {}let flatArr = tree.map(item => {item.children = tree.filter(val => val.pid == item.id)if(item.pid == 0) return itemelse return})return flatArr.filter(item => item != undefined)}console.log(fn(tree))// [// {// id: 1,// name: "1",// pid: 0,// children: [// {// id: 2,// name: "2",// pid: 1,// children: []// },// {// id: 3,// name: "3",// pid: 1,// children: [// {// id: 4,// name: "4",// pid: 3,// children: []// }// ]// }// ]// }// ]
以上只是个人平时学习时记录的方法,如果大家有更好的方法,记得分享给我哈,谢谢!
数据扁平化与反扁平化相关推荐
- PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)
PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...
- [CNN] 卷积、反卷积、池化、反池化
之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积.反卷积.池化.反池化的内容,也希望自己对一些比较模糊的地方可以理解的更加清晰. 一.卷积 1.卷积的简单定义 卷积神经网络中的卷积操作可以看做是 ...
- 深度学习(一)神经网络中的池化与反池化原理
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9579108.html 参考博客:https://blog.csdn.net/chengqium ...
- json与java反射_Java 对象的 Json 化与反 Json 化
最近在家里修习 Java 这项技能,估计快点满技能点儿了,很开心.不过遇到了一个问题,困扰了我一阵子.问题是这样的,我要写 Android App,与服务器交互.大家都知道 Javascript 不知 ...
- json java对象 简书_Java 对象的 Json 化与反 Json 化
最近在家里修习 Java 这项技能,估计快点满技能点儿了,很开心.不过遇到了一个问题,困扰了我一阵子.问题是这样的,我要写 Android App,与服务器交互.大家都知道 Javascript 不知 ...
- Java:JSON扁平化和去扁平化
今天小编在github上发现了一个比较好的JSON扁平化和去扁平化处理方法,话不多说,直接开干. 1.扁平化数据(网上找的一json大串) "{\"type\":10,\ ...
- 什么是 PDF 扁平化?怎样扁平化 PDF? 一起涨知识!
什么是 PDF 扁平化? 为什么要扁平化 PDF? 怎样扁平化 PDF? 你是否也对扁平化这个概念云里雾里?今天带你研究一下到底什么是 PDF 扁平化,以及如何扁平化 PDF 文件,一起涨知识! 一. ...
- 反碎片化技术(外部碎片)的原理
主要参考了<深入linux内核>和<Linux内核深度解析>,另外简单浅析了一下相关内容 文章目录 反碎片化技术(外部碎片) 虚拟可移动区域 使用方法 技术原理 解析内核引导参 ...
- 不安全的反序化基础原理(Insecure deserialization)
文章目录 不安全的反序化(Insecure deserialization) 什么是序列化? 不安全的反序列化漏洞是如何产生的? 序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的, ...
最新文章
- sort()排序(Comparable、Comparator)
- 【开发者的精进】 数据驱动下的程序设计
- 基于Spark的电影推荐系统实现
- 什么是工序分析法?工序分析的方法和实施步骤有哪些
- mac dmg包签名及公证
- 三种T检验的详细区分
- no-cache和no-store的区别
- 程序人生 - 2020年杭州市积分入学实施办法权威解读
- python积累--读写文本文件实例
- Python提取图片二维码Python
- pcm转mp3_前端音频可视化——PCM数据解决方案
- 妙法删除多余Windows XP管理员账户
- 传感器与检测技术(一)
- 二元logistic模型案例_二元选择(logistic的s )模型.ppt
- NSX-T系列:第1部分 - 架构和部署
- Memcache(MC)系列(五)使用memcache-top监控memcache集群状态
- python_爬虫http协议
- 关于shm_open和shm_unlink的使用问题 undefined reference to
- 【程序人生】阿里大牛专访丨星罡:因为期待_你需要更出色!
- 武大计算机系自招,武汉大学自主招生考试模式及武大2017自招考试试题