JS 数组扁平化

布满荆棘的人生 2024-04-17 20:42 139阅读 0赞

假如有一个数组 var arr = [1, [2, 3, [4]]] ,我们怎么能把arr变成[1, 2, 3, 4]呢?即让多维数组降维,转换为只有一层的数组。
1. 循环数组+递归

  1. function flatten(arr){
  2. var result = [];
  3. for(var i = 0, len = arr.length; i < len; i++){
  4. if(Array.isArray(arr[i])){
  5. result = result.concat(flatten(arr[i]));
  6. }else{
  7. result.push(arr[i]);
  8. }
  9. }
  10. return result;
  11. }
  12. flatten(arr) // [1,2,3,4]

2. 利用apply
可以使用apply的原因如下:

  1. var arr = [1, [2, 3, [4]]];
  2. [].concat.apply([],arr);
  3. // [1,2,3,[4]]

实现思路:利用arr.some判断当数组中还有数组的话,递归调用flatten扁平函数(利用apply扁平), 用concat连接,最终返回arr;

  1. function flatten(arr){
  2. while(arr.some(item=>Array.isArray(item))){
  3. arr=[].concat.apply([],arr);
  4. }
  5. return arr;
  6. }

3. reduce方法
reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。
能使用reduce原因如下:

  1. var flattened = arr.reduce(function(prev, cur){
  2. return prev.concat(cur)
  3. },[])
  4. console.log(flattened);
  5. // [1,2,3,[4]]

实现思路:使用reduce, 当数组中还有数组的话,递归调用flatten扁平函数(利用reduce扁平), 用concat连接,最终返回arr.reduce的返回值;

  1. function flatten(arr){
  2. return arr.reduce(function(prev, cur){
  3. return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
  4. },[])
  5. }
  6. flatten(arr) // [1,2,3,4]

4. es6 展开运算符
可以使用es6 展开运算符的原因如下:

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

实现思路:利用arr.some判断当数组中还有数组的话,递归调用flatten扁平函数(利用es6展开运算符扁平), 用concat连接,最终返回arr;

  1. function flatten(arr){
  2. while(arr.some(item => Array.isArray(item))){
  3. arr = [].concat(...arr);
  4. }
  5. return arr;
  6. }
  7. flatten(arr) // [1,2,3,4]

**5. toString方法(数组元素为数字) **
如果数组的元素是数字,那么我们可以考虑toString()方法,其他情况不适用。原因如下:

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

实现思路:数组适用toString()方法后变成以逗号分割的字符串,然后map遍历数组把每一项再变回整数并返回map后的结果。

  1. function flatten(arr){
  2. return arr.toString().split(',').map(function(item){
  3. return parseInt(item);
  4. })
  5. }
  6. flatten(arr) // [1,2,3,4]

参考: https://blog.csdn.net/original\_heart/article/details/78906911

发表评论

表情:
评论列表 (有 0 条评论,139人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数组扁平

    概念:用于将嵌套多层的数组“拉平”,变成一维的数组 方法一:通过concat将二维数组转化为一维数组 原理:通过将扩展运算符,将数组内部展开,并通过concat连接两个

    相关 js数组扁平处理

    经典面试题,项目中用js数组操作的地方很多,js数组扁平化是其中一种 什么是数组扁平化? > 数组扁平化就是将一个多维数组转换为一个一维数组 实现基本方式 1、对数

    相关 JS数组扁平

    一道笔试题,将一个嵌套数组扁平化处理。   ▍题目 > 将\[1,2,\[3,\[4,5\]\]\]转化成\[1,2,3,4,5\]。   ▍方法一:递归

    相关 js 数组扁平

    第一种 > 依次把每一项添加进新数组 > 如果为非数组,直接添加 > 如果为数组,则添加递归操作的结果 function flatten(ar