Heading for the future

JS数组拍平

日常中我们可能会遇到将多维数组转换为一维数组的需求,让我们来看看如何实现

toString()方法

let array = [1, [2], [3, [4, [5]]]]
function flat(arr) {
  return arr.toString().split(',').map(val => +val) // +是为了将字符串转为数字
}
// 结果为 [1,2,3,4,5]

reduce结合递归

const arr = [1, [[2], 3, 4], 5];
const flatten = arr => {
  return arr.reduce((flat, toFlat) => {
    return flat.concat(Array.isArray(toFlat) ? flatten(toFlat) : toFlat);
  }, []);
};
const res = flatten(arr);
// 结果为: [1,2,3,4,5]

flat()方法(参数只有一层的情况)

const arr = [1, [2, 3, 4], 5];
arr.flat();
// 结果为: [1,2,3,4,5]

扩展题目

编写一个 JavaScript generator 函数,接受一个仅包含数字的多维数组 ,返回一个迭代器,可以遍历得到它拍平以后的结果。例如:

const numbers = flatten2([1, [[2], 3, 4], 5])
numbers.next().value // => 1
numbers.next().value // => 2
numbers.next().value // => 3
numbers.next().value // => 4
numbers.next().value // => 5

实现

function* flatten2(a) {
  var length = a.length;
  for (var i = 0; i < length; i++) {
    var item = a[i];
    if (typeof item !== 'number') {
      yield* flatten2(item);
    } else {
      yield item;
    }
  }
}
posted @ 2020-09-03 13:08  一只菜鸟攻城狮啊  阅读(905)  评论(0编辑  收藏  举报