一个系列带你搞定前端面试的手写代码环节(6) --- 数组扁平化

news/2024/7/10 22:56:56 标签: 面试, javascript, 前端, 数组, es6

这期的内容是数组扁平化,这也是很考察基本功的一道题,解决的办法也比较多。

在这里插入图片描述

什么是数组扁平化

常规的解释就是把一个多维数组转成一维数组,比如形如[1, [2, [3, [4, [5]]]]]数组转为[1,2,3,4,5]

javascript">// 来个示例数组
let arr = [1, [2, [3, [4, [5]]]]];

flat()方法 + Infinity

JS是有提供原生处理数组扁平化的方法的,就是flat()方法,但是flat()默认是拉平一层的嵌套数组,传入数字几就拉平几层。但是在很多情况下,我们并不能直接知道要拉平的数组长度,所以我们可以传一个Infinity进去,Infinity代表无穷大,所以无论你数组长度是多少,都可以给你拉平。

javascript">let brr1 = arr.flat(Infinity);
console.log(brr1);

JSON对象

JSON.stringify可以把数组或对象转为字符串,JSON,parse可以把字符串转为对应的数组和对象,我们可以先将数组转为字符串,然后通过replace方法把多余的]或[去掉,就可以实现数组的扁平化。

javascript">let brr2 = JSON.parse("[" + JSON.stringify(arr).replace(/\[|\]/g, "") + "]");
console.log(brr2);

递归

最常规最原始的办法就是通过递归来完成,在每一次递归的过程中,如果碰到当前的项不是数组的值,就push到一个新数组里面,如果是数组,就遍历这个数组

javascript">let brr3 = arr => {
    /**
     * 用递归, 用for循环加递归也可以, 这里用reduce
     * reduce 累加器, 本质上也是循环
     * cur 是循环的当前一个值, 相当于for循环里的arr[i], pre是前一个值, 
     * 相当于for循环里的 arr[i - 1]
     */
    let crr = arr.reduce((pre, cur) => {
        return pre.concat(Array.isArray(cur) ? brr3(cur) : cur);
    }, [])
    return crr;
}
console.log(brr3(arr));  // [1, 2, 3, 4, 5]

递归遍历的过程方法也有很多,可以使用原始的for循环,也可以使用一些ES5 ES6的高阶API来完成。

QQ:505417246
微信:18331092918
微信公众号:Code程序人生
个人博客:http://rayblog.ltd

在这里插入图片描述


http://www.niftyadmin.cn/n/1576382.html

相关文章

洛谷P1449 后缀表达式 栈 模拟 字符串

洛谷P1449 后缀表达式 栈 模拟 字符串 栈模拟一下 碰到 . 如果输入的是数字就把数字放进栈中 1 #include <cstdio>2 #include <cstring>3 #include <cmath>4 #include <cstdlib>5 #include <string>6 #include <algorithm>7 #include <…

一个系列带你搞定前端面试的手写代码环节(7) --- 手写new操作符

在Java中可能出现最多的关键字就是new&#xff0c;然而在我们的JavaScript也有new操作符&#xff0c;出现的频率也越来越高&#xff0c;你知道在JavaScript中new操作符都做了些什么&#xff1f; new操作符做了什么 创建了一个空的js对象(即{})将空对象的原型prototype指向构造…

js动态规划 找零问题

function MinCoinChange(coins) {var coins coins;// cache存储了1到37的最优解// 37的找零 是36 或者32 或者27 或者12 的最优解个数1var cache {};this.makeChange function(amount) {var me this;if (!amount) {return [];}if (cache[amount]) {return cache[amount]…

请说说CommonJS和ES module的区别

CommonJS 1.module代表当前模块 在CommonJS中&#xff0c;一个文件就是一个模块&#xff0c;模块中的变量、函数、类都是私有的外部不可以访问&#xff0c;并规定module代表当前模块&#xff0c;exports是对外的接口。 CommonJS主要依赖于module这个类&#xff0c;我们可以看…

Profiling Templates

仿形模板Profiling Templates 在工具&#xff0c;您将使用仿形模板来分析你的应用程序&#xff08;见图26-1&#xff09;。仿形模板是一个跟踪文件已经预先配置了仪器设置进行微量的常见类型。仿形模板可用当您启动工具&#xff0c;创建一个新文档&#xff0c;或启动一个跟踪从…

5分钟教你用nodeJS手写一个mock数据服务

对于前端开发者而言&#xff0c;JavaScript正扮演者越来越重要的地位&#xff0c;它不仅能为浏览器端赋能&#xff0c;在web服务器方面也有很大的价值(我们可以用nodeJS来写服务端的应用&#xff0c;启动web服务器)&#xff0c;因此本文所要描述的&#xff0c;便是JavaScript在…

C#期末作业——学生成绩管理

作业要求 学生成绩管理 &#xff08;1&#xff09;class Student { int id; string name; int score; Student next; } &#xff08;2&#xff09;用链表或系统List类实现。用数组实现也可&#xff08;上限100条记录&#xff09;&#xff1f; &#xff08;3&#xff09;增&…

关于HTTP缓存的故事

最近面试被问到了HTTP缓存的内容&#xff0c;没有了解过太多&#xff0c;只是在某些文章中看到过&#xff0c;知道强缓存和协商缓存这俩名词&#xff0c;具体是什么并没有了解过。 关于前端的缓存其实大致就可以区分为浏览器缓存和HTTP缓存&#xff0c;平时可能在业务开发中用到…