将多层级数组转化为一级数组(即提取嵌套数组元素最终合并为一个数组)

2022-10-28 10:50:29 浏览数 (1)

代码已上传至github

github代码地址:https://github.com/Miofly/mio.git

将多层级数组转化为一级数组

把多层级数组的元素提取出来合并为一个一级数组

需求:多维数组=>一维数组

下方为多层级数组示例:

代码语言:javascript复制
let ary = [1, [2, [3, [4, 5]]], 6];// -> [1, 2, 3, 4, 5, 6]

1. 调用ES6中的flat()方法

代码语言:javascript复制
ary = ary.flat(Infinity);

flat() 方法会移除数组中的空项:

代码语言:javascript复制
var arr4 = [1, 2, , 4, 5];
arr4.flat();
// [1, 2, 4, 5]

2. replace split

代码语言:javascript复制
ary = str.replace(/([|])/g, '').split(',')

3. replace JSON.parse()

代码语言:javascript复制
str = str.replace(/([|])/g, '');
str = '['   str   ']';
ary = JSON.parse(str);

4. 普通递归

代码语言:javascript复制
let result = [];
let fn = function(ary) {
  for(let i = 0; i < ary.length; i  ) {
    let item = ary[i];
    if (Array.isArray(ary[i])){
      fn(item);
    } else {
      result.push(item);
    }
  }
}

5. 利用reduce函数迭代

对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。

reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。

回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:

如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;

如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。

如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

如果数组为空且没有提供initialValue,会抛出TypeError

如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。

代码语言:javascript复制
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))

6:ES6扩展运算符

代码语言:javascript复制
//只要有一个元素有数组,那么循环继续
while (ary.some(Array.isArray)) {
  ary = [].concat(...ary);
}

0 人点赞