Loading

JS数组相关(二)

数组的扁平化

数组扁平化就是将多维数组变成一维数组的过程。

这里的讨论我们分成两种情况吧:一种是数组元素是数字,另一种是数组包含多种数据类型。

数字数组

1、toString + split

  let arr = [1, 2, 3, [4, 5, [6]]];
  let str = arr.toString().split(',').map(item => parseInt(item));
  console.log(str); // [1, 2, 3, 4, 5, 6]

数组执行toString()方法会为每个元素执行toString,使其转化为字符串。

2、join + split

  let arr = [1, 2, 3, [4, 5, [6]]];
  let str = arr.join(',').split(',').map(item => parseInt(item))
  console.log(str); // [1, 2, 3, 4, 5, 6]
通用方法

1、flat()方法(ES6方法)
flat()方法可以指定深度,默认深度为1,传Infinity表示彻底扁平化。无视数据类型。

  let arr = [1, 2, 3, [4, {name: 'aa'}, [6]]];
  let str = arr.flat(Infinity);
  console.log(str); // [1, 2, 3, 4, {name: 'aa'}, 6]

2、借用正则方法
可以先借用JSON.stringify将数组转换为字符串,然后通过正则匹配去掉‘[’和‘]’。

  let arr = [1, 2, 3, [4, {name: 'aa'}, [6]]];
  let str = JSON.stringify(arr);
  str = str.replace(/(\[|\])/g, '')
  str = `[${str}]`
  str = JSON.parse(str)
  console.log(str)

此处需要注意,正则匹配去掉'[',']'之后,即第三步,不可以直接用使用split()方法将字符串转成数组,那样做会导致数组中的数字变成字符,改变了数据类型。

3、使用for循环递归
循环递归的思路就是,判断数组的每一项是不是数组,如果不是数组,就把该项加到新数组里,如果是数组就递归执行。

  function arrayFlat(arr) {
        let result = [];
        let f = function(arr){
              for(let i = 0; i < arr.length; i++) {
                    if(Array.isArray(arr[i])) {
                          f(arr[i]);
                    } else {
                          result.push(arr[i])
                    }
              }
        }
        f(arr)
        return result;
  }

4、借助reduce方法

  function arrayFlat(arr) {
        let f = function(arr) {
              return arr.reduce((prev, cur) =>{
                    if(Array.isArray(cur)) {
                          return [...prev, ...f(cur)]
                    } else {
                          return [...prev, cur]
                   }
              }, [])
        }
        return f(arr)
  }
posted @ 2020-11-19 17:30  Yang-0394  阅读(90)  评论(0)    收藏  举报