Skip to content

编写高质量代码


一、手写一个函数,实现数组扁平化

1. Array Flatten

  • 写一个 JS 函数,实现数组扁平化,只减少一级嵌套
  • 如输入 [1, [2, [3]], 4],输出 [1, 2, [3], 4]

2. 思路

  • 定义空数组 arr = [] 遍历当前数组
  • 如果 item 非数组,则累加到 arr
  • 如果 item 是数组,则遍历之后累加到 arr

3. 代码

  • 使用 push

    typescript
    /**
     * 数组扁平化 - 使用 push
     * @param arr
     */
    export function flatten1(arr: any[]): any[] {
        const res: any[] = []
        arr.forEach(item => {
            if (Array.isArray(item)) {
                item.forEach(value => res.push(value))
            } else {
                res.push(item)
            }
        })
        return res
    }
  • 使用 concat

    typescript
    /**
     * 数组扁平化 - 使用 concat
     * @param arr
     */
    export function flatten2(arr: any[]): any[] {
        let res: any[] = []
        arr.forEach(item => {
            res = res.concat(item)
        })
        return res
    }

4. 单元测试

typescript
/**
 * @description 数组扁平化 - 单元测试
 * @author lzz
 */

import {flatten1, flatten2} from './1. 数组扁平化'

describe("数组扁平化单元测试", () => {
    it('空数组', () => {
        const res = flatten1([])
        expect(res).toEqual([])
    })
    it('非嵌套数组', () => {
        const res = flatten1([1, 2, 3, 4, 5])
        expect(res).toEqual([1, 2, 3, 4, 5])
    })
    it('一级嵌套', () => {
        const res = flatten1([1, [2, 3, 4], 5])
        expect(res).toEqual([1, 2, 3, 4, 5])
    })
    it('二级嵌套', () => {
        const res = flatten1([1, [2, [3], 4], 5])
        expect(res).toEqual([1, 2, [3], 4, 5])
    })
})

(连环问) 实现数组深度扁平化

1. Array Flatten 彻底 “ 拍平 ”

  • 写一个 JS 函数,实现数组扁平化,减少所有嵌套层级
  • 如输入 [1, [2, [3]], 4],输出 [1, 2, 3, 4]

2. 思路

  • 先实现一级扁平化,然后 递归调用,直到全部扁平

3. 代码

typescript
/**
 * 数组深度扁平化
 * @param arr
 */
export function flatten(arr: any[]): any[] {
    let res: any[] = []
    arr.forEach(item => {
        if (Array.isArray(item)) {
            res = res.concat(flatten(item))
        } else {
            res.push(item)
        }
    })
    return res
}