返回

JS 数组扁平化:从多维到一维的无缝转换

前端

剖析数组扁平化:从多维到一维的华丽转身

JavaScript 数组是强大的数据结构,但有时,我们需要将多维数组转换为一维数组,以方便后续处理或提高程序性能。这种转换被称为数组扁平化。数组扁平化可以应用于各种场景,如数据分析、数据可视化、算法实现等。

1. 递归:逐层递进,剥离多维嵌套

递归是一种强大的编程技术,它可以轻松解决许多复杂问题,数组扁平化也不例外。我们可以使用递归来逐层递进,将多维数组中的元素逐个取出,并将其添加到一维数组中。以下是如何使用递归实现数组扁平化:

function flatten(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(flatten(arr[i]));
    } else {
      result.push(arr[i]);
    }
  }
  return result;
}

2. reduce:巧用累加,轻松合并数组

reduce 是数组的另一个强大方法,它可以将数组中的元素逐个累加,并返回最终结果。我们可以使用 reduce 来实现数组扁平化,将多维数组中的所有元素累加到一维数组中。以下是如何使用 reduce 实现数组扁平化:

function flatten(arr) {
  return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
}

3. concat:逐个拼接,构建一维数组

concat 是数组的另一个常用方法,它可以将两个或多个数组连接成一个新数组。我们可以使用 concat 来实现数组扁平化,将多维数组中的所有元素逐个连接到一维数组中。以下是如何使用 concat 实现数组扁平化:

function flatten(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    result = result.concat(Array.isArray(arr[i]) ? flatten(arr[i]) : [arr[i]]);
  }
  return result;
}

4. flat:一劳永逸,原生扁平化

ES6 中引入了 flat 方法,它可以将多维数组直接转换为一维数组。flat 方法的语法非常简单,如下所示:

arr.flat([depth]);

depth 参数指定要将数组扁平化的层数,如果不指定,则默认扁平化一层。例如,以下是如何使用 flat 将一个二维数组扁平化:

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

5. flatMap:一步到位,扁平化并映射

flatMap 是 ES2019 中引入的数组方法,它结合了 map 和 flat 方法,可以将数组中的每个元素映射到一个新数组,然后将所有新数组合并成一个一维数组。flatMap 方法的语法如下所示:

arr.flatMap(callback);

callback 函数是映射函数,它接收数组中的每个元素作为参数,并返回一个新数组。例如,以下是如何使用 flatMap 将一个二维数组扁平化并映射为一个新数组:

const arr = [[1, 2], [3, 4]];
console.log(arr.flatMap(x => x * 2)); // [2, 4, 6, 8]

结语

数组扁平化是一种常见的编程任务,在 JavaScript 中有多种方法可以实现。我们可以使用递归、reduce、concat、flat 和 flatMap 等方法来将多维数组转换为一维数组。每种方法都有其优缺点,选择哪种方法取决于具体需求和场景。