2.多种数组方法 扁平化

2019年的ES10中新增了扁平化API flat

①flat实现指定深度的数组扁平化

function flatten6(arr,depth = 1) {
    if (!Array.isArray(arr)) return []
    if(typeof depth !== 'number') depth = 1
    let curDepth = 1  
    function flat(arr,curDepth){
        return Array.prototype.reduce.call(arr, (total, cur) =>{
            // 无需扁平化的场景: 超过深度阈值 或 当前元素非数组
            if(curDepth > depth || !Array.isArray(cur)){
                total.push(cur)
                return total
            }else{
                curDepth ++
                return total.concat(flat(cur,curDepth))
            }
        }
        , [])
    }
    return flat(arr,curDepth)
}

②普通的递归实现

  const a = [1, [2, [3, [4, 5]]]];
  const 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;
  };
  console.log(flatten(a));

③利用reduce函数迭代

 const flatten = (arr) => {
    return arr.reduce((prev,next)=>{
      return prev.concat(Array.isArray(next)?flatten(next):next)
    },[]);
  };
  console.log(flatten(a));

④扩展元素符实现 some  some会返回一个boolea值

  const flatten = (arr) => {
    while(arr.some(item=>Array.isArray(item))){
      arr = [].concat(...arr);
    }
    return arr;
  };
  console.log(flatten(a));

⑤es6的flat   深度最好使用Infinity

const a = [1, [2, [3, [4, 5]]]];
const flatten = (arr) => {
  return arr.flat(Infinity)
};
console.log(flatten(a));

 

 

⑥使用split和toString共同处理   split是字符串的方法 不是数组的那个splice方法

  const flatten = (arr) => {
    return arr.toString().split(',')
  };
  console.log(flatten(a));

通过这两个方法可以将多维数组直接转换成逗号连接的字符串,然后再重新分隔成数组

⑦用正则和JSON来处理

  const flatten = (arr) => {
    let str = JSON.stringify(arr);
    str = str.replace(/(\[|\])/g,'');
    str = `[${str}]`;
    return JSON.parse(str);
  };
  console.log(flatten(a));

 

posted @ 2023-03-05 08:51  不想做混子的奋斗远  阅读(71)  评论(0)    收藏  举报