面试常问:数组拍平(扁平化)实现

前言:

数组拍平 是面试官喜欢问的问题之一,通常面试官会让你手撕 flat 代码,我正好碰到一个 类似数组拍平 的题目,借此机会整理归纳一下 数组拍平方法  Array.prototype.flat()

题目描述


 const _flatten = arr => {   
       return arr.flat(Infinity)
     }

我一开始直接 使用 flat ,传入参数(Infinity),将数组完全转为一维数组,答题结果就一行代码,然后提示报错了,我没有注意到题目要求是返回原数组,使用 flat方法 返回的都是新数组,不满足题目要求所以报错

 Array.prototype.flat()

注:数组拍平方法  Array.prototype.flat() 也叫数组扁平化、数组拉平、数组降维。 本文统一叫:数组拍平

const arr = ["????", ["????", "????"], ["????", ["????", ["????"]], "????"]];
 
// 不传参数时,默认“拉平”一层
arr.flat();
// ["????", "????", "????", "????", ["????", ["????"]], "????"]
 
// 传入一个整数参数,整数即“拉平”的层数
arr.flat(2);
// ["????", "????", "????", "????", "????", ["????"], "????"]
 
// Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
arr.flat(Infinity);
// ["????", "????", "????", "????", "????", "????", "????"]
 
// 传入 <=0 的整数将返回原数组,不“拉平”
arr.flat(0);
arr.flat(-10);
// ["????", ["????", "????"], ["????", ["????", ["????"]], "????"]];
 
// 如果原数组有空位,flat()方法会跳过空位。
["????", "????", "????", "????",,].flat();
// ["????", "????", "????", "????"]
  • Array.prototype.flat() 用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

  • 不传参数时,默认“拉平”一层,可以传入一个整数,表示想要“拉平”的层数。

  • 传入 <=0 的整数将返回原数组,不“拉平”

  • Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组

  • 如果原数组有空位,Array.prototype.flat() 会跳过空位。

 手撕 flat

实现思路

如何实现呢,思路非常简单:实现一个有数组拍平功能的 flat 函数,我们要做的就是在数组中找到是数组类型的元素,然后将他们展开。这就是实现数组拍平 flat 方法的关键思路。

有了思路,我们就需要解决实现这个思路需要克服的困难:

  • 第一个要解决的是遍历数组的每一个元素;

  • 第二个要解决的是判断元素是否是数组;

  • 第三个要解决的是将数组的元素展开一层;

 代码


const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, "string", { name: "flat" }];
// concat + 递归
function flat(arr) {
  let arrResult = [];
  arr.forEach(item => {
    if (Array.isArray(item)) {
    //arguments.callee代表函数名,代表递归 调用函数
      arrResult = arrResult.concat(arguments.callee(item))  
    } else {
      arrResult.push(item);
    }
  });
  return arrResult;
}
flat(arr)

 本文提供了一种方法实现 flat , 遍历数组或者判断元素是否为数组元素 还可以使用别的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潮汐未见潮落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值