面试题-展开数组:深度解析与实现技巧

94 阅读4分钟

在软件开发尤其是数据处理领域,数组是最基本的数据结构之一。然而,实际应用中经常遇到嵌套数组的情况,即数组中包含数组。为了便于处理和分析,我们需要将这样的嵌套数组“展开”,使其成为一维数组。本文将围绕“展开数组”这一主题,从递归方法入手,探讨如何有效地将多维数组转化为一维数组,并进一步介绍数组转换的其他技巧,以期为面试准备及日常开发提供有价值的参考。

一、递归法展开数组

1.1 递归的基本概念

递归是一种在函数内部调用自身的技术,常用于解决具有重复子问题的问题。递归的关键在于定义出基本情况(base case)和递归情况(recursive case)。在处理嵌套数组时,基本情况是遇到非数组元素时直接将其加入结果数组;递归情况则是遇到数组元素时,再次调用函数处理这个子数组。

1.2 递归实现步骤

创建结果数组

首先,在函数外部或内部初始化一个空数组result,用来存储最终展开后的所有元素。

let result = [];

编写递归函数

定义一个名为flattenArray的函数,接收一个数组作为参数。

function flatten(arr) {
    // 函数体
}

处理数组元素

在函数内部,遍历输入的数组arr,对每个元素进行判断:

  • 如果元素是数字,直接将其添加到result数组中。
  • 如果元素是数组,则递归调用flattenArray函数,处理这个子数组。
let result = [];
    // len 缓存了这个值,arr 是对象 ,读取对象.length 耗时
    for(var i=0, len= arr.length ;i<len; i++){
        //数组,递归
        if(Array.isArray(arr[i])){
            result = result.concat(flatten(arr[i]))
        }else{
            result.push(arr[i]);
        }
        //否 加入数组
    }

    return result

返回并输出结果

在递归结束后,返回result数组。如果是在主函数中直接调用,可以进一步输出这个结果。

return result;
console.log(result);

1.3 示例代码

const arr=[1,[2,[3,4]]];

function flatten(arr){
    let result = [];
    // len 缓存了这个值,arr 是对象 ,读取对象.length 耗时
    for(var i=0, len= arr.length ;i<len; i++){
        //数组,递归
        if(Array.isArray(arr[i])){
            result = result.concat(flatten(arr[i]))
        }else{
            result.push(arr[i]);
        }
        //否 加入数组
    }

    return result
}

console.log(flatten(arr))

1.4 结果:

image.png

二、转换方法展开数组

除了递归外,还有其他方法可以间接实现数组的展开,比如通过字符串转换和分割。这种方法虽不如递归直观,但在特定场景下也能发挥作用。

2.1 数组转字符串

首先,将整个数组(包括嵌套的数组)转换为一个字符串。由于数组的toString()方法会自动将数组元素连接成字符串,并在元素间插入逗号,因此可以直接使用此方法。

let arrayString = nestedArray.toString();

2.2 字符串分割与转换回数组

然后,利用split()方法,以逗号为分隔符将字符串分割成数组元素的字符串数组。最后,使用map()方法将这些字符串转换回数字。

let splitArray = arrayString.split(',').map(Number);

2.3 示例代码

var arr=[1,[2,[3,4,[5,[6]]]]]

function flatten(arr) {
    //['1','2','3','4','5','6]
    //map
    return arr.toString().split(',').map(function(item){
        return +item  //隐式类型转换
    })

}
console.log(flatten(arr));

2.4 结果

image.png

2.5 注意事项

尽管这种方法简单直观,但存在局限性,比如无法正确处理数组元素中包含逗号的情况。因此,这种方法更适合于处理元素类型单一且不包含特殊字符的数组。

三、总结

展开数组是一个常见的编程任务,递归是解决这类问题的强有力工具,它能有效处理任意深度的嵌套数组。此外,通过数组到字符串的转换和再处理也是一种思路,但适用范围有限。掌握这些技巧不仅有助于应对面试题,更能提升日常开发中处理复杂数据结构的能力。在实际应用中,可根据具体情况选择最适合的方法,以达到高效、准确地展开数组的目的。