清明节,这几天放假闲来无事,好好研究一下基础知识,今天看看数组扁平化该怎么处理:

先来看数组扁平化是什么:

var arr = [1,2,3,4,[5,6,[7,8]],true] =>

[1,2,3,4,5,6,7,8,true]

就是把二维或者多维数组,转成一维数组。

1、我想大部分同学会和一样,首先想到的肯定是遍历数组,如果某一项是基本数据类型,直接push到新数组,如果某一项是数组,则直接将这一项concat到新的数组上,当然如果是多维数组,还得用上递归的方法,继续往下层寻找,上代码:

function flatten(arr) {

var result = []

for (var i = 0; i < arr.length; i++) {

console.log(arr[i])

if (Array.isArray(arr[i])) {

result = result.concat(flatten(arr[i])) // 如果是数组,则直接拼接到新数组

} else {

result.push(arr[i]) // 基本类型数据,直接push到新数组

}

}

return result

}

console.log(arr, flatten(arr)) //  [1, 2, 3, 4, Array(3), true] [1, 2, 3, 4, 5, 6, 7, 8, true]

我们看看结果,已经得到我们想要的结果了,且原数组没变化。

2、第二种方法:使用 数组的reduce(fn(), init, index, arr)+concat()方法

a.遍历每一项,并按fn()中规则处理每一项: 如果是基本类型,暴力concat到要返回的数组中,如果是数组则拼接到返回的数组上,如果是多维数组,递归调用;

b.init是要返回结果的初始值;

c第三和四参数可省略。

function flatten(arr) {

return arr.reduce((result, item) => {

return result.concat(Array.isArray(item) ? flatten(item) : item)

}, [])

}

console.log(arr, flatten(arr)) //  [1, 2, 3, 4, Array(3), true] [1, 2, 3, 4, 5, 6, 7, 8, true]

我们看看结果,也得到我们想要的结果了,且原数组没变化。

3、第三种方法: 使用while循环some条件和apply特性,我们知道apply(obj, [ ])

a.第一个参数,是要调用已存在方法的对象,例如c.apply(d, []) ,d就继承了c的特性,这个参数和这篇文章没有太大关系,可以先不理解;

b.第二个参数是指的,要处理的数据,且一定是一个值,可以是数组或其他值,但必须是一个,如果是一个数组,那么会一次处理数组中的元素。好,这里就是利用这个特性,一次处理数组中的每一项,当然包括二级和多级数组:

function flatten(arr) {

while (arr.some(item => Array.isArray(item))) { // 只要arr中某一项还是数组,则一直执行下去,直到全转成基本类型数据

arr = [].concat.apply([], arr) // 这里第二个新[]继承了concat方法,所以能对arr中的元素逐一concat到第二个新[]中。

}

return arr

}

console.log(arr, flatten(arr)) //  [1, 2, 3, 4, Array(3), true] [1, 2, 3, 4, 5, 6, 7, 8, true]

// 第一遍执行返回: [1,2,3,4,[5,6,[7,8]],true] => [1,2,3,4,5,6,[7,8],true],我们看到只处理了第二层数组[5,6,[7,8]],把这个数组当成一项直接concat到新数组,

//第三层[7,8]没有处理,但第三层已经变成了第二层,再处理一次即可

// 第二遍执行返回: [1,2,3,4,5,6,[7,8],true] => [1,2,3,4,5,6,7,8,true] 得到我们先要的结果

// 如果还有第四层或更多,while循环会一直执行下去,直到变成一维数组。

4、使用ES6中展开运算符...和while循环,方法3你能理解的话,这个就很好理解了,我不管了,上代码,自己分析:

function flatten(arr){

while (arr.some(item => Array.isArray(item))){

arr = [].concat(...arr); // 如果你明白展开运算符的作用,是不是很简单?

}

return arr;

}

好了,今天主要分析了二维和多维数组降到一维的几种方法,当然还有其他方法,如果数组中全是数字的话,也可以使用toString()或者join()结合split(),先转成字符串,再转成数组的方法:

var arr = [1,2,3,4,[5,6,[7,8]]]

function flatten(arr) {

return arr.toString().split(‘,‘).map(item => {

return item - 0 // 字符转数字: item - 0 , + item , item * 1 , item / 1都能实现

})

}

console.log(flatten(arr)) // [1,2,3,4,5,6,7,8]

以上是我对数组扁平化处理方法的理解while遍历有两种,分别是apply和ES6展开运算符操作,for循环结合递归一种,reduce()遍历一种,说来说去还是离不开遍历,现在清楚多了,如果你有好的想法,欢迎分享出来。

JAVA数组扁平化整合_数组扁平化的几种处理放法相关推荐

  1. JAVA数组扁平化整合_一文搞定数组扁平化(超全面的数组拉平方案及实现)

    前言 面试手写代码在大厂面试中非常常见,秋招中面试小米就手写了一道flat实现的代码题,当时通过递归方式实现了数组扁平化逻辑,但没有考虑多种实现方案及其边界条件(主要是对所涉及到高阶函数的知识点不够熟 ...

  2. java大括号定义数组_Java基础语法_数组

    数组的概念 数组的概念:是一种容器,可以同时存放多个数据值 数组的特点: 1.数组是一种引用数据类型 2.数组当中的多个数据,类型必须统一 3.数组的长幅在程序运行期间不可改变 数组的定义格式 数组的 ...

  3. vue数组转list集合_数组转换成集合

    package com.loaderman.jdk5; import java.util.ArrayList; import java.util.Arrays; import java.util.Li ...

  4. 如何给6个整数的一维数组某个元素赋值_数组指针详解

    文章部分资料来源: Pointer to an Array | Array Pointer - GeeksforGeeks​www.geeksforgeeks.org 介绍数组指针之前,先来回顾指针: ...

  5. java 轻量级插件化框架_轻量级插件化框架——Small

    photo-1441716844725-09cedc13a4e7.jpg 前言 世界那么大,组件那么小.Small,做最轻巧的跨平台插件化框架. --Galenlin 这是Small作者,林光亮老师, ...

  6. JAVA数组扁平化整合_JS数组扁平化(flat)方法总结详解

    需求:多维数组=>一维数组 let ary = [1, [2, [3, [4, 5]]], 6]; let str = JSON.stringify(ary); 第0种处理:直接的调用 arr_ ...

  7. java数组length是下标_数组的下标与长度

    我们知道数组实际上是一种简单的数据结构,它在计算机中是顺序存储的,而我们要使用数组,实际上就是要使用数组中的元素. 如:现在有一个数组:int[] a = {13,15,59,28};那么我们如何找到 ...

  8. java数组不初始化长度_数组之初始化 Java

    数组初始化后,长度就不变了:内部数据类型要一致 数组的初始化可以有很多种形式 都需要声明占用内存一块地,起名字,赋大小.可以加初值也可不加(还是会有默认值:int-0:String-null:Bool ...

  9. 数组 最大差值_数组两元素的最大差:从暴力到多线程

    参考leetcode第121题,大值需要出现在小值之后.这道题可以用其他更简单的方法解决,但是下面解法中用到的动态规划思想可以去解比如说最大连续子数组这种问题. 初始化 初始化一个长度为10^4的数组 ...

最新文章

  1. 慎用Outline ,UGUI Outline实现原理分析
  2. 元空间和直接内存_JVM探秘:Java内存区域
  3. XMLHttpRequest对象在IE和Firefox中创建方式有没有不同?
  4. cuda,nvidia-driver ,cudnn下载地址及版本对应
  5. 专家支招:如何利用Plesk搭建完美全能开发环境
  6. Apache Velocity官方指南-资源
  7. 第二课计算机ppt,第二课计算机系统.ppt
  8. AngularJs 入门系列-1 使用 AngularJs 搭建页面基本框架
  9. 简练软考知识点整理-公邀竞单询其
  10. 搭建nuxtjs程序 —— 用户信息 or token怎么不丢失
  11. 用FTP命令实现自动下载和上载文件
  12. 网络工程师干货:华为设备故障管理命令大全
  13. aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  14. android前置拍照镜像代码,在Android中镜像前置摄像头
  15. AppleScript开机自动登录ChinaUnicom
  16. 模仿“选择游戏角色的页面”
  17. 西人应该骄傲,全国对不起山西
  18. Java Number 类和方法
  19. 2018-12-24:企业微信分享功能
  20. 【互联网及其应用】第3章网络技术基础

热门文章

  1. c语言数字的拆解_C语言解决变态推理题
  2. 自然语言处理NLP-100例 | 第二篇:在线课程评论情感分析-本科毕设实战案例
  3. numpy.ones() 详解
  4. Jupyterlab 插件安装后侧边栏找不到的解决
  5. 【Linux】28_网站服务动态站点
  6. 解决问题:EnvironmentLocationNotFound: Not a conda environment: /anaconda3/envs/anaconda3
  7. 【机器学习PAI实践二】人口普查统计
  8. 开源APM技术选型与实战
  9. 流式计算新贵Kafka Stream设计详解--转
  10. Linux下C语言的调试--转