当前位置: 首页 > news >正文

前端小技巧: 拍平数组的6种常见方法

关于数组拍平

  • 所谓数组拍平,就是按照顺序,把他们全放在一个数组中
  • 需要考虑多层级和嵌套的问题来彻底拍平数组
    *

实现方案

1 )一般思路, 先实现一级扁平化,然后递归,直到全部扁平

function flat(arr) {const res = [];arr.forEach(item => {if(Array.isArray(item)) {const flatItem = flat(item); // 递归flatItem.forEach(n => res.push(n));} else {res.push(item);}})return res;
}const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] );
console.log(res); // [1, 2, 3, 4, 10, 20, 100, 200, 5]

2 )基于 Array的concat方法和递归实现, 优化方案1

function flat(arr) {// 验证 arr 中,还有没有深层数组 [1, 2, [3, 4]]const isDeep = arr.some(item => item instanceof Array);if (!isDeep) return arr; // 已经是 flatern [1, 2, 3, 4]// 如果有深层数组,则拍平,示例:[].concat(1,2,[3,4],5) 返回 [1,2,3,4,5], 利用concat方法的拍平const res = Array.prototype.concat.apply([], arr);return flat(res); // 递归
}const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] );
console.log(res); // [1, 2, 3, 4, 10, 20, 100, 200, 5]

3 )使用reduce实现

function flat(arr) {return arr.reduce((result, current) => {if (Array.isArray(current)) {return result.concat(flat(current));}return result.concat(current);}, []);
}const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] );
console.log(res); // [1, 2, 3, 4, 10, 20, 100, 200, 5]

4 )基于String的toString方法和递归实现

function flat(arr) {// 验证 arr 中,还有没有深层数组 [1, 2, [3, 4]]const isDeep = arr.some(item => item instanceof Array)if (!isDeep) return arr // 已经是 flatern [1, 2, 3, 4]// 如果有深层数组,则拍平,转换成字符串拍平const res = arr.toString().split(',').map(val => +val);return flat(res) // 递归
}const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] );
console.log(res); // [1, 2, 3, 4, 10, 20, 100, 200, 5]

5 )直接使用toString方法即可拍平成字符串,再转成数组即可,方案4的优化版本

function flat(arr) {return arr.toString().split(',').map(val => +val);
}const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] );
console.log(res); // [1, 2, 3, 4, 10, 20, 100, 200, 5]

6 ) 使用 Array的 flat() 方法, 注意参数的使用,可以用 Infinity 代替具体的层数

function flat(arr) {return arr.flat(Infinity);
}const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] );
console.log(res); // [1, 2, 3, 4, 10, 20, 100, 200, 5]
http://www.lryc.cn/news/225100.html

相关文章:

  • c++day6
  • LeetCode(1)合并两个有序数组【数组/字符串】【简单】
  • 剪贴板管理软件 Paste Wizard mac中文版功能特色
  • 【数据结构】树的基本性质(计算树的总结点数与叶结点数)
  • android手机平板拓展电脑屏幕
  • 接口测试的流程
  • HMAC 详解:在 Golang 中实现消息认证码
  • 阻塞队列和定时器的使用
  • JavaScript脚本操作CSS
  • Rust4.1 Managing Growing Projects with Packages, Crates, and Modules
  • RPA在财务预测和分析中的应用
  • 无人机航拍技术基础入门,无人机拍摄的方法与技巧
  • PTA 哈密尔回路(建图搜索)
  • 如何利用产品帮助中心提升用户体验
  • 【Python大数据笔记_day05_Hive基础操作】
  • css呼吸效果实现
  • 机器视觉opencv答题卡识别系统 计算机竞赛
  • 2024年的后端和Web开发趋势
  • 对比了10+网盘资源搜索工具,我最终选择了这款爆赞的阿里云盘、百度网盘、夸克网盘资源一站式搜索工具
  • GoLong的学习之路(二十)进阶,语法之反射(reflect包)
  • 关于表单校验,:rules=“loginRules“
  • 统一消息分发中心设计
  • 前端项目导入vue和element
  • 【11】使用透视投影建立一个3D空间的测试
  • 【广州华锐互动】VR影视制片虚拟仿真教学系统
  • 从研发域到量产域的自动驾驶工具链探索与实践
  • 404. 左叶子之和
  • 基于SSM的课程管理系统
  • 【hcie-cloud】【5】华为云Stack规划设计之华为云Stack标准化配置、缩略语【下】
  • 搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)