Skip to content

JavaScript之数组扁平化 #14

@chenyong9528

Description

@chenyong9528

1. flat

const arr = [1, 2, [3, [4, [5, [6, 7]]]]]

console.log(arr.flat(Infinity))
// [1, 2, 3, 4, 5, 6, 7]

使用数组内置方法flat,它接收一个参数是需要扁平化的层数,Infinity表示扁平化所有的层

2. 递归

const flatten = (arr) => {
  const result = []
  
  ;(function flat(arr) {
    arr.forEach(v => {
      if (Array.isArray(v)) flat(v)
      else result.push(v)
    })
  })(arr)

  return result
}

console.log(flatten(arr))
// [1, 2, 3, 4, 5, 6, 7]

递归是我们最容易想到的一种方式

3. 递归Generator

const flatten = function* (arr) {
  for (const item of arr) {
    if (Array.isArray(item)) yield* flatten(item) 
    else yield item
  }
}

console.log([...flatten(arr)])
// [1, 2, 3, 4, 5, 6, 7]

4. 队列

const flatten = (arr) => {
  const task = [...arr]
  const result = []

  while (task.length) {
    const first = task.shift()

    if (Array.isArray(first)) {
      task.push(...first)
    } else {
      result.push(first)
    }
  }

  return result
}

console.log(flatten(arr))
// [1, 2, 3, 4, 5, 6, 7]

我们删除数组中的第一个元素,如果第一个不是数组就把它放到结果中,如果是就把它展开并添加到数组的末尾,如此循环直到数组被清空

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions