Skip to content

多维数组 => 一维数组

20210907181702

js
let ary = [1, [2, [3, [4, 5]]], 6]; // -> [1, 2, 3, 4, 5, 6]
let str = JSON.stringify(ary);

<!-- more -->

es6 的 flat 方法

js
arr = arr.flat(Infinity);

replace + split

js
arr = String(arr)
  .replace(/(\[|\])/g, "")
  .split(",");

replace + JSON.parse

js
str = String(arr).replace(/(\[|\])/g, "");
str = "[" + str + "]";
str = JSON.parse(str);

普通递归

js
let result = [];
let rec = (arr) => {
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      rec(arr[i]);
    } else {
      result.push(arr[i]);
    }
  }
};
rec(arr);
js
var a = [1, [2, [3, 4, 5]]];
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;
}
flatten(a); //  [1, 2, 3, 4,5]

利用 reduce 函数迭代

concat 既可以接数组,又可以接对象

js
function flatten(ary) {
  return ary.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
  }, []);
}
let ary = [1, 2, [3, 4], [5, [6, 7]]];
console.log(flatten(ary));

扩展运算符

我们先用数组的 some 方法把数组中仍然是数组的项过滤出来,然后执行 concat 操作,利用 ES6 的展开运算符,将其拼接到原数组中,最后返回原数组

js
//只要有一个元素有数组,那么循环继续
while (ary.some(Array.isArray)) {
  ary = [].concat(...ary);
}

参考链接