首页 > 其他分享 >2.多种数组方法 扁平化

2.多种数组方法 扁平化

时间:2023-03-05 09:11:33浏览次数:68  
标签:多种 arr return 扁平化 flat curDepth flatten 数组 const

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));

 

标签:多种,arr,return,扁平化,flat,curDepth,flatten,数组,const
From: https://www.cnblogs.com/alwaysrun/p/17179784.html

相关文章

  • Java学习笔记(四)java数组
    学习笔记4Java数组一、什么是数组数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每......
  • 154. 寻找旋转排序数组中的最小值 II (Hard)
    问题描述154.寻找旋转排序数组中的最小值II(Hard)已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,4,4,5,6,7]......
  • 数组:统计个数
    #include<stdio.h>intmain(void){ constintnumber=10; intx; intcount[number]; inti; for(i=0;i<number;i++){ count[i]=0; } scanf("%d",&x); while(x!=-1){ if(......
  • 【LeeCode】974. 和可被 K 整除的子数组
    【题目描述】给定一个整数数组 ​​nums​​​ 和一个整数 ​​k​​​ ,返回其中元素之和可被 ​​k​​ 整除的(连续、非空) 子数组 的数目。子数组 是数组的 连续......
  • KMP字符串匹配算法——PMT数组的计算
    Leetcode28.找出字符串中第一个匹配项的下标KMP算法和PMT的介绍如何更好地理解和掌握KMP算法?-海纳的回答-知乎KMP算法PMT数组与next数组构造解释KMP算法就是......
  • 相同的树(树)、买卖股票的最佳时机 II(贪心、数组)、下一个排列(数组、双指针)
    相同的树(树)给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例1:输入:p=[......
  • js遍历数组和遍历对象属性
    遍历数组letjson={key1:"hello",key2:"world"}//最简洁方法for(letkeyinjson){console.log(key,":",j......
  • React.memo 解决函数组件重复渲染
    为什么会存在重复渲染?react在v16.8版本引入了全新的api,叫做ReactHooks,它的使用与以往基于classcomponent的组件用法非常的不一样,不再是基于类,而是基于函数进行......
  • JavaScript——快速判断数组对象的值是否全部满足条件
    前言EasyBe主题开发中遇到一个问题,查看了下MDN文档找到了比较合适的方法,这里只做了简单的示例,详细的一些描述和原理建议访问MDN进行查看;every:everysome:some内容ev......
  • 指针和数组笔试题解析
    在大多数情况下,数组名就是数组首元素的地址,但是有两种特殊情况:一、sizeof(数组名):当数组名单独放在sizeof内部,指的是整个数组二、&数组名:取的是整个数组的地址,但是结果和首......