数组维度升级

创建一维数组

//创建一维数组
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,"\nb",b,"\nc",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,"\nb",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']
}

js—数组那些事儿的更多相关文章

  1. 小兔JS教程(四)-- 彻底攻略JS数组

    在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...

  2. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  3. 转→js数组遍历 千万不要使用for...in...

    看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...

  4. js数组操作大全

    原文(http://www.cnblogs.com/webhotel/archive/2010/12/21/1912732.html) 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简 ...

  5. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  6. js 数组处理函数

    本文转载自有有<js 数组处理函数> concat 将参数列表连接到原数组后面形成一个新的数组并返回,原有数组不受影响. var arr = ["a","b& ...

  7. js 数组赋值问题 :值传递还是引用?

    转载于知乎var a = [1,2,3]; var b = a; a = [4,5,6]; alert(b); //[1,2,3] 面试时被问到这样一个问题,竟然从来没试过... 当时直接的理解,数组 ...

  8. JS数组方法汇总 array数组元素的添加和删除

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...

  9. js数组操作

    用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多, 自以为js高手的自己居然无从下手,一下狠心,我学! ...

随机推荐

  1. 如何在GitHub上大显身手?

    推荐一篇良许大佬的文章,如何在github上大显身手.拥有自己的github,且有所贡献,这是一件很有意义的的事情,在面试上也是加分项哦,赶紧搞起来. 转载至http://uee.me/aHAfN 这 ...

  2. 3、python第三方库的安装方式

    在学习Python过程中,经常要用到很多第三方库,面对各种不同情况,Python为我们提供了多种安装方法,这里主要介绍三种 方法:pycharm在线安装.pip在线安装(强烈推荐).离线安装. 方式一 ...

  3. IO系统-标准C的I/O和文件I/O

    1.标准C的I/O 1.1常用函数和结构体 char *fgets(char *s, int size, FILE *stream); //整行输入 int printf(const char *fo ...

  4. 玩转Django2.0---Django笔记建站基础十(二)(常用的Web应用程序)

    10.3 CSRF防护 CSRF(跨站请求伪造)也成为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用,窃取网站的用户信息来制作 ...

  5. 创建dynamics CRM client-side (四) - Namespace Notation in JS

    我们在开发的时候会写很多functions. 但是这些functions 管理起来很麻烦. 微软内部建议我们使用namespace notation的形式管理我们的代码 // Converting f ...

  6. GC原理---垃圾收集算法

    垃圾收集算法 Mark-Sweep(标记-清除算法) 标记清除算法分为两个阶段,标记阶段和清除阶段.标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间. 优缺点:实现简单,容易产 ...

  7. Docker扩展内容之容器开机自启

    前言 部署项目服务器时,为了应对停电等情况影响正常web项目的访问,会把Docker容器设置为开机自动启动. 在使用docker run启动容器时,使用--restart参数来设置,具体参数如下详解 ...

  8. SpringCloud与微服务系列专栏

    一. 前置知识 学习SpringCloud之前需要具备和掌握如下框架和工具的使用:SpringMVC,Spring,Spring Boot,Mybatis,Maven,Git. SpringCloud ...

  9. ShiroINI配置及加密(三)

    Shiro InI 配置 ini语法: 1.对象名 = 全限定类名 相对于调用 public 无参构造器创建对象 2.对象名. 属性名 = 值 相当于调用 setter 方法设置常量值 3.对象名. ...

  10. Shell脚本深入教程(1):快速入门

    Shell脚本基础入门 Bash注释 Bash只支持单行注释,使用#开头的都被当作注释语句: # 整行注释 echo hello world # 行尾注释 通过Bash的一些特性,可以取巧实现多行注释 ...