返回

flat 手写面试题及解题思路

前端

最近一段时间秋招面哔哩哔哩的时候,面试官问:如何实现 flat 方法?当时手写的并不完美,后来回盘复习,发现面试要求手写数组拍平(扁平化) flat 方法的面试官不在少数。其中包括:拼多多、小米、美团、滴滴、shopee、有赞等。手写 flat 方法是一道非常基础的面试题,通常出现在中级、高级前端开发工程师的面试中。

本文将带领大家详细解析 flat 方法的实现原理,并手把手教大家如何实现自己的 flat 方法。本文适合有一定 JavaScript 基础的前端开发工程师阅读。

flat 方法简介

flat 方法是数组的一个新方法,可以将嵌套数组展平为一维数组。这意味着它可以将一个包含子数组的数组转换为一个包含所有子数组元素的一维数组。

flat 方法的语法如下:

array.flat([depth])

其中:

  • array 是要展平的数组。
  • depth 是可选参数,指定要展平的深度。默认情况下,depth 为 1,表示只展平一层嵌套数组。如果 depth 为 2,则展平两层嵌套数组,依此类推。

flat 方法的实现原理

flat 方法的实现原理相对简单。它使用递归算法来遍历数组,并将子数组中的元素添加到一维数组中。

以下是一个使用递归算法实现 flat 方法的代码示例:

function flat(array, depth = 1) {
  if (depth <= 0) {
    return array;
  }

  let result = [];

  for (let i = 0; i < array.length; i++) {
    const element = array[i];

    if (Array.isArray(element)) {
      result = result.concat(flat(element, depth - 1));
    } else {
      result.push(element);
    }
  }

  return result;
}

如何实现自己的 flat 方法

现在,我们已经了解了 flat 方法的实现原理,就可以自己动手实现一个 flat 方法了。

以下是一个使用迭代算法实现 flat 方法的代码示例:

function flat(array, depth = 1) {
  let result = [];

  const stack = [array];

  while (stack.length > 0) {
    const currentArray = stack.pop();

    for (let i = 0; i < currentArray.length; i++) {
      const element = currentArray[i];

      if (Array.isArray(element) && depth > 0) {
        stack.push(element);
      } else {
        result.push(element);
      }
    }

    depth--;
  }

  return result;
}

flat 方法的常见问题解答

1. flat 方法支持哪些浏览器?

flat 方法在大多数现代浏览器中都支持,包括 Chrome、Firefox、Safari、Edge 和 Opera。

2. flat 方法的性能如何?

flat 方法的性能很好,因为它使用递归或迭代算法来遍历数组,并且不会创建新的数组。

3. flat 方法的局限性是什么?

flat 方法的局限性在于它只能展平嵌套数组。如果数组中包含其他数据类型,例如对象、函数或字符串,则 flat 方法将无法将这些数据类型展平。

总结

flat 方法是数组的一个新方法,可以将嵌套数组展平为一维数组。flat 方法的实现原理相对简单,可以使用递归或迭代算法实现。flat 方法在大多数现代浏览器中都支持,性能很好,但局限性在于它只能展平嵌套数组。