实现数组扁平化的方法有几种?

2020-12-13 14:03发布

8条回答
嘿呦嘿呦拔萝卜
2楼 · 2020-12-14 09:35

第一:读取数组 for循环

第二:合并数组 concat

第三:数组变为字符串格式 join

第四:删除最后一个元素,针对老数组是删除最后一个,针对新数组是返回最后一个 pop

第五:添加最后一个元素,针对老数组最后一个元素后面添加一个元素,新数组返回元素个数 push



随便来看看
3楼 · 2020-12-14 09:45

数组扁平化是指将一个多维数组变为一维数组

1. reduce

遍历数组每一项,若值为数组则递归遍历,否则concat。

2. toString & split

调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组

3. join & split

和上面的toString一样,join也可以将数组转换为字符串

4. 递归

递归的遍历每一项,若为数组则继续遍历,否则concat

5. 扩展运算符

es6的扩展运算符能将二维数组变为一维

小小李兆佳
4楼 · 2020-12-14 11:07

1. reduce

遍历数组每一项,若值为数组则递归遍历,否则concat。

2. toString & split

调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组

3. join & split

和上面的toString一样,join也可以将数组转换为字符串

4. 递归

递归的遍历每一项,若为数组则继续遍历,否则concat

5. 扩展运算符

es6的扩展运算符能将二维数组变为一维


我是大脸猫
5楼 · 2020-12-14 16:31

一、扁平化的概念

扁平化管理是企业为解决层级结构的组织形式在现代环境下面临的难题而实施的一种管理模式。当企业规模扩大时,原来的有效办法是增加管理层次,而现在的有效办法是增加管理幅度。当管理层次减少而管理幅度增加时,金字塔状的组织形式就被“压缩”成扁平状的组织形式。

二、数组扁平化 

用于将嵌套多层的数组“拉平”,变成一维的数组 

1、[1, [2]] => [1,2]2、[[1, 2], [3, 4]] => [1, 2, 3, 4]3、[1, 2, [3, 4, [5, 6]]] => [1, 2, 3, 4, 5, 6]

 

三、数组扁平化的几种方法 

【1】Array.prototype.flat()

flat()方法会按照一个可指定的深度depth递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。该方法不会改变原数组

语法: let newArray = arr.flat(depth) 
描述: depth为指定要提取嵌套数组的结构深度,默认值为 1
            flat() 方法会移除数组中的空项

例子:

let arr1 = [1, 2, [3, 4]];arr1.flat(); // [1, 2, 3, 4]// 指定要提取嵌套数组的结构深度为1层let arr2 = [1, 2, [3, 4, [5, 6]]];arr2.flat(1); // [1, 2, 3, 4, [5, 6]]// 指定要提取嵌套数组的结构深度为2层let arr3 = [1, 2, [3, 4, [5, 6]]];arr3.flat(2); // [1, 2, 3, 4, 5, 6]// 使用 Infinity 作为深度,展开任意深度的嵌套数组let arr4 = [1, 2, [3, 4, [5, 6]]]arr4.flat(Infinity); // [1, 2, 3, 4, 5, 6]// 移除数组中的空项let arr5 = [1, 2, , 4, 5];arr5.flat(); // [1, 2, 4, 5]

 【2】归并方法 reduce()

我们用reduce函数进行遍历,把prev的初值赋值为[],如果当前的值是数组的话,那么我们就递归遍历它的孩子,如果当前的值不是数组,那么我们就把它拼接进数组里。

let arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]];function flat(arr) {return arr.reduce(function (prev, cur) {return prev.concat(Array.isArray(cur) ? flat(cur) : cur);}, [])}console.log(flat(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

【3】toString()

toString()方法有很大局限性,只适用于数组元素全部为数字的情况下

// toString && Json.paraselet arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]];function flat(arr) {var str = arr.toString();return JSON.parse('[' + str + ']');}console.log(flat(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]// toString && splitlet arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]];function flat(arr) {return arr.toString().split(',').map(item => {return Number(item)})}console.log(flat(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]// join && splitlet arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]];function flat(arr) {return arr.join(',').split(',').map(item => {return Number(item);})}console.log(flat(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

【4】循环+递归

递归的遍历每一项,若为数组则继续遍历,否则concat

let arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]];function flat(arr) {let result = [];arr.map(item => {if (Array.isArray(item)) {result = result.concat(flat(item));} else {result.push(item);}});return result;}console.log(flat(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

【5】扩展运算符. . .

... 用于取出参数对象的所有可遍历属性,拷贝到当前对象中

let arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]]function flat(arr) {while (arr.some(item => Array.isArray(item))) {arr = [].concat(...arr);}return arr;}console.log(flat(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]


用户555666
6楼 · 2020-12-14 17:09

数组扁平化是指将一个多维数组变为一维数组

1. reduce

遍历数组每一项,若值为数组则递归遍历,否则concat。

2. toString & split

调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组

3. join & split

和上面的toString一样,join也可以将数组转换为字符串

4. 递归

递归的遍历每一项,若为数组则继续遍历,否则concat

5. 扩展运算符

es6的扩展运算符能将二维数组变为一维


寂静的枫林
7楼 · 2020-12-15 09:25

1.二维数组时,可以简单使用flat()方法

2.迭代实现 (ES6扩展运算符...)

3.普通递归实现

4.高级递归(reduce方法)

5. toString()

该方法利用了 toString 把数组变成以逗号分隔的字符串,然后可通过遍历数组把每一项再变回原来的类型。

6.[].concat.apply


相关问题推荐

  • 回答 97
    已采纳

    Js给初学者的印象总是那么的杂而乱,相信很多初学者都在找轻松学习Js的途径。在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条轻松学习Js之路。Js给人那种感觉的原因多半是因为它如下的特点:A:本身知识很抽象、晦涩难懂,如:闭包、内置...

  • 回答 4

    看图:

  • 回答 18

    基本类型( 6种 ):Number ( 数值 ) String ( 字符串 )Boolean ( 布尔 ) Undefined ( 未定义 )Null ( 空 )ES6 - Symbol  ( 唯一 )

  • 回答 19

    JavaScript 使网页增加互动性,使有规律地重复的HTML文段简化,减少下载时间。JavaScript 能及时响应用户的操作,对提交表单做即时的检查,无需浪费时间交由 CGI 验证。JavaScript 的特点是无穷无尽的,只要你有创意。...

  • 回答 18

    timeoutId: 定时器IDfunc: 延迟后执行的函数code: 延迟后执行的代码字符串,不推荐使用原理类似eval()delay: 延迟的时间(单位:毫秒),默认值为0param1,param2: 向延迟函数传递而外的参数,IE9以上支持setInterval: 以固定的时间间隔重复调用一个函...

  • 回答 15

    Number类型String类型Boolean类型Undefined类型Null类型

  • 回答 14

    空格在ASCII中的值为32,空字符为0,可本人觉得不就是都是为空的吗,没有什么区别?char mychar1,mychar2;mychar1=' ';mychar2='\0';printf(mychar1=%d,mychar2=%d,mychar1,mychar2);//其中mychar1=32;mychar2=0;...

  • 回答 16

    1.变量名可以有数字0~9、大小写字母、下划线、美元符$组成。2.变量名不能以数字开头。 当我们以数字为开头时,代码就会出现橙色下划线,代表命名不...3.变量名不允许使用中文。 不能允许使用中文这个就不用多说了吧,不管你在哪找代码来看,代码中...4.区分大小写...

  • 回答 8

    向一个对象数组里面添加新的属性var arry= [{a:11,b:22,c:33,d:44},{a:11,b:0,c:0,d:44},{a:11,b:22,c:99,d:99}];var arry2=[];arry.map(((item, index)=> {arry2.push(Object.assign({},item,{mess1:item.c,mess2:item.d}))}))cons...

  • 回答 2

    我觉得getTopWindow() 应该是他自己写的函数 mask  应该是getTopWindow()函数中 return 出的一个什么玩意show()  jQuery的显示

  • 回答 16

    看上图

  • 回答 9

    如图所示

  • 回答 12

    1、原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链 2、 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链...

  • js选项卡的实现原理2021-06-15 21:48
    回答 6

    如图所示,最简单的选项卡思路:选项卡就是点击按钮切换到相应内容,其实就是点击按钮把内容通过display(block none)来实现切换的。1、首先获取元素。2、for循环历遍按钮元素添加onclick 或者 onmousemove事件。3、因为点击当前按钮时会以高亮状态显示,所以...

  • 回答 4

    1、js截取两个字符串之间的内容:123var str = aaabbbcccdddeeefff; str = str.match(/aaa(\S*)fff/)[1]; alert(str);//结果bbbcccdddeee2、js截取某个字符串前面的内容:123var str = aaabbbcccdddeeefff; tr = str.match(/(\S*)fff/)[1];......

  • 回答 4

    如果是ajax 就直接获取如果是传到一个页面 就再get再在js中使用 就可以获取了。 可以在js中获取一个变量 但是不能写入一段java代码.

没有解决我的问题,去提问