zoukankan      html  css  js  c++  java
  • js—数组那些事儿

    数组维度升级

    创建一维数组

    //创建一维数组
    var a=[];
    var b=new Array();
    var c=[1,2,'w'];
    var d=[1,2,[1,2]];
    

    创建二维数组

    var c=[[1,2],[1,2]];
    

    //创建二维7*7数组,且填充为‘[w]’
    var a=new Array(7);
    for(var i=0; i<7; i++){
        a[i] = new Array(7).fill('[w]');
    }
    

    数组维度降级(n维变1维)

    数组降维-掘金

    n维变1维

    var a=[1,[2,3],[2,[3,4]],6];

    • concat方法(普遍通用)
    while(a.some(item=>Array.isArray(item))){
        a=[].concat(...a);}
    
    • 字符串方法(适应于纯数字的多维数组中)
    var b=a.toString().split(',').map(i=>parseInt(i));
    
    • es6的flat()方法chrome69才开始支持
    a.flat(Infinity);
    

    数组的浅拷贝与深拷贝

    数组浅拷贝与深拷贝方法-sf

    浅拷贝

    • 直接赋值(浅拷贝),
    • slice,concat,Array.from方法,扩展运算符(首层深拷贝),对象还有Object.assign()
    var a=[1,2,[3,4]];
    var b=a; // b=[1,2,[3,4]];
    var c=[...a];  //c=[1,2,[3,4]];
    b[0]=100; c[2][0]=101;
    console.log("a",a,"
    b",b,"
    c",c); //a[100,2,[101,4]]  b[100,2,[101,4]]  c[1,2,[101,4]]
    

    深拷贝

    • JSON的parse和stringify方法,但是该方法又局限性,不能适用于对象中含有undefined、function、symbol,他们会在转换过程中被忽略。。。
    var a=[1,2,[3,4]];
    var b=JSON.parse(JSON.stringify(a));
    b[2][0]=100;
    console.log("a",a,"
    b",b);  //a[1,2,[3,4]]  b[1,2,[100,4]]
    
    • 递归就是对每一层的数据都实现一次 创建对象->对象赋值 的操作
    function deepClone(source){
      const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
      for(let keys in source){ // 遍历目标
        if(source.hasOwnProperty(keys)){
          if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下
            targetObj[keys] = source[keys].constructor === Array ? [] : {};
            targetObj[keys] = deepClone(source[keys]);
          }else{ // 如果不是,就直接赋值
            targetObj[keys] = source[keys];
          }
        } 
      }
      return targetObj;
    }
    

    判断空数组arr=[]

    • 法一
    if(Array.isArray(arr) &&  arr.length===0){
        console.log('是空数组');
    }
    

    数组去重(适用题型:返回不重复数组,返回不重复数组的长度,返回重复的数值组成的数组)

    var a=[1,2,2,4,2,4];

    • 法一 返回重复值组成的数组
    function duplicates(arr) {
        var a=[];
        for(var i=0;i<arr.length;i++){        
            if(arr.indexOf(arr[i])!=arr.lastIndexOf(arr[i])&& a.indexOf(arr[i]) == -1){
                a.push(arr[i]);
            }
        }
        return a;
    }
    
    • 法二 返回重复值组成的数组
    function duplicates(arr) {
        return arr.filter((val,i,arr)=>arr.indexOf(val)!===i && arr.lastIndexOf(val)===i); //返回的是[2,4]
    }
    
    • 法三 返回重复值的个数
    function duplicates(arr) {
        return arr.sort().join('').match(/([^])1+/g).length;  //这里match匹配之后返回的是['222','44']
    }
    
  • 相关阅读:
    Linux shell(3)
    Linux shell 编写(2)
    Linux shell 编写(1)
    团队冲刺(一)
    峦码团队任务表
    电梯演讲&界面展示说明
    第一次小组会议——NABCD讨论
    开发项目&团队介绍
    Linux中查看各文件夹大小命令:du -h --max-depth=1
    shell脚本[] [[]] -n -z 的含义解析
  • 原文地址:https://www.cnblogs.com/hiluna/p/9390788.html
Copyright © 2011-2022 走看看