js的tree数组对象扁平化思否_js中数组扁平化处理
js中数组扁平化处理
经典面试题,项目中可以用到js数组操作的地方很多,js数组扁平化是其中一种
什么是数组扁平化?
数组扁平化就是将一个多维数组转换为一个一维数组
实现的基本方式
1、对数组的每一项进行遍历。
2、判断该项是否是数组。
3、如果该项不是数组则将其直接放进新数组。
4、是数组则回到1,继续迭代。
5、当数组遍历完成,返回这个新数组。
实现数组扁平化代码
1.常规方式 递归处理
Array.prototype.flatten = function () {
var resultArr = [];
var len = this.length;
for (var i = 0; i < len; i ++) {
if (Array.isArray(this[i])) {
resultArr = resultArr.concat(this[i].flatten());
} else {
resultArr.push(this[i]);
}
}
return resultArr;
}
var arr=[1,2,3,[4,5,'hello',['world',9,666]]]
console.log(arr.flatten())//[1, 2, 3, 4, 5, "hello", "world", 9, 666]
2.使用reduce方法
Array.prototype.flatten = function () {
return this.reduce(function (prev, cur, curIndex, arr) {
return Array.isArray(cur) ? prev.concat(cur.flatten()) : prev.concat(cur);
}, []);
}
3. yield*的用法,天才级别的扁平化方式
function* iterTree(tree){
if(Array.isArray(tree)){
for(let i = 0 ;i
yield* iterTree(tree[i]);
}
}else{
yield tree;
}
}
let arr1 = [1, 2, ['a', 'b', ['中', '文', [1, 2, 3, [11, 21, 31]]]], 3];
let list=[]
for (const x of iterTree(arr1)) {
list.push(x)
}
console.log(list);//[1, 2, "a", "b", "中", "文", 1, 2, 3, 11, 21, 31, 3]
4. es6中的flat函数也可以实现数组的扁平化
let arr1 = [1,2,['a','b',['中','文',[1,2,3,[11,21,31]]]],3];
console.log( arr1.flat( Infinity ) );
5.扩展运算符
//ES6 增加了扩展运算符,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中:
var arr = [1, [2, [3, 4]]];
console.log([].concat(...arr)); // [1, 2, [3, 4]]
//我们用这种方法只可以扁平一层,但是顺着这个方法一直思考,我们可以写出这样的方法:
// 改进
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
console.log(flatten(arr))
js的tree数组对象扁平化思否_js中数组扁平化处理相关推荐
- js的tree数组对象扁平化思否_js 中的tree型数组如何去重与合并?
假设数据是这样的,不难发现,其中父级roleCode有重复的,子级roleCode也有重复的,如何做到把重复的去掉,同时,又可以把不重复的合并到一起呢? testTreeData: [ { roleC ...
- js的tree数组对象扁平化思否_JS专题之数组展开
前言 首先什么是数组展开? 假如现在有这样一个需求:将后台的一个多重 List 数据,展开成一个 List 后,并去重后排序: ["a", "b", [&quo ...
- JS - 将tree(树形)数据结构格式改为一维数组对象格式(扁平化)
需求:将JSON①数据格式输出为JSON②格式. JSON①: [{sortName:'小明',sortCode: 'xm',children:[]},{sortName:'小刚',sortCode: ...
- php中json字符串转json对象数组对象,php – 将JSON字符串解析为数组,而不是对象
您正在尝试将对象视为数组,而对象不是数组,它是一个对象. 每次在JSON中看到{}时,这意味着"这些神圣括号中包含的内容是动态对象".当你看到[]时,这意味着"看哪!我是 ...
- js删除数组中指定元素_js中数组操作详解
今天给大家带来一篇有关数组操作方法的文章. 新建数组 方法一:通过new运算符创建一个数组构造函数. var arr = new Array(); 方法二:通过方括号直接创建直接量数组. var ar ...
- java中字符串和数组如何比较_[Java教程]javascript中数组和字符串的方法比较
[Java教程]javascript中数组和字符串的方法比较 0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的 ...
- javascript --- 函数的柯里化 Vue 2.x中柯里化的使用
函数式编程部分重点 参考资料: 函数式编程 柯里化 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数 var add = function (x) {return function(y ...
- go 声明二维数组_一篇文章了解Go语言中数组Arrays的使用内幕
概述 与其他编程语言类似,Go语言也有数组array.Go语言中,数组的行为和其他语言没有什么不同.Go语言中还有一个叫做切片slice的东西,它就像是对数组的引用.在本文中,我们将只研究数组. 定义 ...
- java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...
java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...
- mybatis-plus存数组对象,并从数据库查出这个数组
数组实体类 数据库表实体类 注意:一定要加@TableField(typeHandler = MyJacksonTypeHandler.class)这个注解. MyJacksonTypeHandler ...
最新文章
- cap = cv2.VideoCapture(0).read()摄像头读取图片用法
- 重构碎片化知识_知识碎片化时代,如何妙用思维导图,提高你的学习效率(含福利)...
- Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词
- jstat分析_jstat –分析
- 模板 字段_劲爆新功能:轻流文字识别(OCR)功能支持自定义识别模板啦
- [翻译] 学习iOS开发的建议:如何从菜鸟到专家
- 使用Lucene索引和检索POI数据
- cli vue webpack 实战_Vuejs技术栈从CLI到打包上线实战全解析
- Spring学习笔记之二----基于XML的Spring AOP配置
- Android自定义样式
- GraphX中Pregel单源点最短路径(转)
- mybaties中的selectKey和useGeneratedKeys=true
- 使用Go实现Socket服务端和客户端通信
- 搭建AutoCAD License服务器
- 冰冻三尺非一日之寒——大型网站架构演进
- python-skimage.io,filters,transform
- win10查看电池损耗
- loadrunner 操作mysql_loadrunner学习笔记(从MYSQL中取数据)
- 遍历二维数组(从外向内绕圈)
- C++字符串赋值、拼接、查找、替换、存取、插入删除和子串
热门文章
- iOS 通过商品短链接跳转京东商品详情页
- 简单的Android 红外线遥控
- CVPR 2019 | SPADE 阅读笔记(翻译)
- 0CTF-2016-Web-piapiapia
- spark kryo java,在Spark中自定义Kryo序列化输入输出API
- 秋姑娘_我爱秋天作文300字
- 我的世界服务器无限矿区块指令,我的世界:不用动手也能挖到钻石?来自指令玩家的方法...
- 《廊桥遗梦》这样确切的爱,一生只有一次
- 1024程序员节日背后的神秘面纱
- 空间句法软件Axwoman6.3 安装及ArcGIS 工具加载