js 数组扁平化的几种实现方式

JavaScript数组扁平化(Array Flattening)全解析:从基础到进阶的9种实现方式及深度对比 本文系统总结了JavaScript中数组扁平化的实现方法与应用场景。主要内容包括: 原生方法:介绍Array.prototype.flat()、扩展运算符+concat等方法的使用与局限; 递归与迭代:对比递归遍历、迭代循环等实现方式的优缺点; ES6新特性:展示Generator函数、解构赋值等新特性的应用; 第三方库:提及Lodash的工业级实现方案。文章通过代码示例详细说明各方法的适用场景、性能表现和注意事项,为处理多维数组提供了全面的技术方案参考。 阅读详情

一、什么是数组扁平化

扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁、简单,突出主题。
数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层的数组。

Ps: flatten 可以使数组扁平化,效果就会如下:

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr)); // [1, 2, 3, 4]

从中可以看出,使用 flatten 处理后的数组只有一层,下面我们来试着实现一下。

二、简单实现

1普通递归

/* ES6 */
const flatten = (arr) => {
  let result = [];
  arr.forEach((item, i, arr) => {
    if (Array.isArray(item)) {
      result = result.concat(flatten(item));
    } else {
      result.push(arr[i])
    }
  })
  return result;
};

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

2.toString()
该方法是利用 toString 把数组变成以逗号分隔的字符串,然后遍历数组把每一项再变回原来的类型。
先来看下 toString 是怎么把数组变成字符串的

[1, [2, 3, [4]]].toString()
// "1,2,3,4"

完整的展示

/* ES6 */
const flatten = (arr) => arr.toString().split(',').map((item) => +item);

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
//[1,2,3,4]

3 [].concat.apply + some
利用 arr.some 判断当数组中还有数组的话,循环调用 flatten 扁平函数(利用 [].concat.apply扁平), 用 concat 连接,最终返回 arr;

/* ES6 */
const flatten = (arr) => {
  while (arr.some(item => Array.isArray(item))){
    arr = [].concat.apply([], arr);
  }
  return arr;
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

4.reduce()
reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:

function flatten(arr){
  return arr.reduce(function(prev, cur){
    return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
  }, [])
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));


5.es6结构运算符
… 每次只能展开最外层的数组,被 [].concat 后,arr 就扁平化一次。

function flatten(arr){
  while(arr.some(item => Array.isArray(item))){
    arr = [].concat(...arr);
  }
  return arr;
}

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

多维数组扁平化处理 数组扁平化: 就是把多层嵌套的数组中的内容取出,变成一维的数组 就像 [1, 2, 3,[4, 5], [6, 7, [8, 9]], 10,11] 处理成 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 1. 递归方式处理 咱们在写递归的时候,其实只需要考虑两层就好,因为再往后其实就是和之前一样了,要不然一直跟着程序的执行想下去 ,搞不好连自己都绕进去了 let arr = [1, 2, 3, [4, 5], [6, 7, [8, 9]], 10, 11] funct. 阅读详情

相关推荐

【深度学习】通俗易懂讲解循环神经网络LSTM

目录 1、循环神经网络(Recurrent Neural Networks) 2、长依赖存在的问题 3、LSTM 网络 4、LSTMs的核心思想 5、一步一步理解LSTM 6、LSTM的变种 7、总结 1、循环神经网络(Recurrent Neural Networks) 人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。...

Nieson2012的专栏 2730

实现数组扁平化的 6 种方式

实现数组扁平化的 6 种方式 扁平化的实现: 数组的扁平化其实就是将一个嵌套多层的数组 array(嵌套可以是任何层数)转换为只有一层的数组。即: [1, [2, [3, 4,5]]] ----> [1, 2, 3, 4,5] 方法一:调用 ES6 中的 flat arr.flat([depth]) 其中 depth 是 flat 的参数,depth 是可以传递数组的展开深度(默认不填、数值是 1),即展开一层数组。那么如果多层的该怎么处理呢?参数也可以传进 Infinity,代表不论多少层都要展

weixin_44920863的博客 3753

dq轴坐标系下的电路方程

dq轴坐标系下的电路方程 dq轴坐标系是一种常见的电路方程,但是再dq轴坐标系下电路元件的电压电流dq轴存在一定的耦合,本文针对三相电路推导了dq轴坐标系下的电路电路方程进行一个推导,首先先列出来派克变换的公式 派克变换 [AdAqA0]=23[cos⁡(θ)cos⁡(θ−2π/3)cos⁡(θ+2π/3)−sin⁡(θ)−sin⁡(θ−2π/3)−sin⁡(θ+2π/3)1/21/21/2][AaAbAc]\left[\begin{array}{c}A_d\\A_q\\A_0 \end{array}\ri

Mr.Young的博客 1万+

数组扁平化的8种方法

什么是数组扁平化;超全的数组扁平化方法归纳

weixin_45185103的博客 7267

STM32F103C8T6实战:手把手教你搭建智能火灾报警系统(附MQ-2传感器调试技巧)

本文详细介绍了基于STM32F103C8T6单片机和MQ-2烟雾传感器的智能火灾报警系统搭建过程。从硬件选型、电路设计到软件开发,提供全面的实战指导,特别包含MQ-2传感器调试技巧,帮助开发者快速实现稳定可靠的智能火灾监控系统。

year5的博客 213

利用R批量计算相关系数

批量求相关系数

weixin_52073820的博客 1458

数组扁平化的8种方法 - js篇

用简单的话来说,就是将一个。

阿莹yes的博客 2237

海康威视 2024届 数字逻辑设计 实习笔试分析

记录一下 5月11日晚,做的海康威视的一场笔试。分享给需要的IC人。 岗位:数字逻辑设计工程师(浙江 杭州) 转载需要本人同意! 我的见解不一定都是准确的,欢迎评论区交流指正~~

记录所学,分享知识,结识挚友 1万+

js实现数组扁平化的几种方式

数组偏平化 数组的扁平化就是将一个嵌套多层的数组转换为只有一层的数组,扁平化也是面试中常见的考题。举个简单的例子,假设有个名为 flatDeep 的函数能实现数组扁平化效果,代码运行效果如下面: var array = [1, [2, [3, [4, 5]]]]; console.log(flatDeep(array)); // [1, 2, 3, 4,5] 像上述能实现偏平化的flatDeep函数实现方式有好几种,下面就尝试这几种方式实现一个flatDeep函数吧。 方法一:递归 通过循环递归的方式,一

AI小美好 9658

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3219

姿态传感器/陀螺仪之IIS2DLPC 应用驱动程序设计

* 转换为°C单位 (参考温度为25°C,灵敏度为16 LSB/°C) */

corlin6688的博客 220

js数组扁平化的几种实现方式

1. 递归调用 let res = []; function flattern(arr) { arr.map(item => { if (Array.isArray(item)) res.concat(flattern(item)); else res.push(item); }) } 2. reduce结合递归 function flattern(arr) { return arr.reduce

aeipyuan 404

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture

有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。

博客 1495

JS实现数组扁平化的几种常见方式

1. 利用es6新方法 2. 利用递归 2.1 利用 some 递归 2.2 利用 map 递归 2.3 利用 reduce 递归 3. 利用 toString 4. 利用 join

猫老板的豆 1008

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用JS实现数组扁平化的几种方式

使用JS实现数组扁平化的几种方式

qq_52732369的博客 907

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaScript数组原理3:实现数组扁平化的几种方式

JavaScript数组原理3:实现数组扁平化的几种方式 数组的扁平化其实就是将一个嵌套多层的数组array(嵌套可以是任意层数)转换为只有一层的数组 举一个代码的例子: var arr = [1,[2,[3,4,5]]]; console.log(flatten(arr));[1,2,3,4,5] ...

sharp0016的博客 312

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js的tree数组对象扁平化思否_JavaScript基础 - 数组扁平化/降维的4种方法

1. Array.prototype.flat()缺点:需要计算数组的维度var arr = [ 1, [2, 21, [22, 221, [2211, 2212]]], [3, [31, 32, [33, 331]]], 4, {'name': 'jack'}]arr.flat(4); // [1,2,21,22,221,2211,2212,3,31,32,33,331,4,{'name': ...

weixin_39876595的博客 334

数组扁平化(展开多层嵌套数组)

方法一 arr.join(',').split(','); 方法二 const flatten = (arr) => { return arr.reduce( (prev, cur) => prev.concat(cur instanceof Array ? flatten(cur) : cur), [] ) }

Liuer_Qin的博客 744

前端面试题(手写扁平化函数)

前端面试题 —(数组扁平化) RUNOOB—>ES6数组方法flat() 数组扁平化(又称数组降维) MET:flat()方法会按照一个可指定的深度递归遍历数组,并将所有的元素与遍历出来的数组中的元素合并为一个新数组返回; var test = ['a', ['b', 'c'], ['d', ['e', ['f']], 'g']] // flat不传参数时,默认扁平化一层 test.flat() // ["a", "b", "c", "d", ["e", ["f"]], "g"] // flat传

Immerse的 Blog 328

JS面试须知--数组

数组

kxdhshlg的博客 139

经典JS算法

例题1:数组去重 输入:[1,2,2,,6,,10,9,1,3,] 输出:[1,2,6,10,9,1,3] 条件:去掉空、保持输入顺序 function dedupe(arr){ let setArr = new Set(); let res = []; for(let k in arr){ //元素不为空、并且没有在setArr出现过 if( arr[k] != null && !setArr.has(arr[k])){

weixin_41950078的博客 411

js push二维数组_Js面试题:如何实现数组扁平化?

写在前面:数组扁平化是指将一个多维数组变为一维数组,如:将多维数组:[1,[2,3,[4,5]]]转为一维数组:[1,2,3,4,5]如何实现?1.reducefunction flatten(arr) { returnarr.reduce((result,item)=>{returnresult.concat(A...

weixin_39683526的博客 362

数组排序与flat方法

数组排序 arr2 = [13, 24, 51, 3]; arr2.sort(compare); // [3, 13, 24, 51] function compare(a,b){ return a-b; } 降序 function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0;

weixin_46845202的博客 172
上一篇: 熬夜总结50个js高级知识点(一)
下一篇: 跨域的几种方法
goodfornothing-s
博客等级 码龄8年 105粉丝 36原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值