1.数组是引用数据类型中的对象数据类型(特殊对象)
1.创建一个数组,也是要开辟一个堆内存,堆内存中存储数组对象中的键值对
- 1)数组中我们看到的每一项都是属性值,默认的属性名是数字,数字从零开始递增,数字代表当前是第几项,我们把代表位置的数字属性名称为“索引”;数组是以数字为索引,索引从零开始递增的结构!
- 2)默认存在一个length属性,代表数组的长度(有多少项)
- 3)数组中存在的每一项可以是任何数据类型
let arr = [10, 20, 30];
0 : 10
1 : 20
2 : 30
length : 3
2.真实项目中,我们从服务器获取到的数据,一般都是对象或者数组(JSON格式),而且结构层级一般也都是多级结构,所以学会数组/对象的相关操作,能够根据需求把获取的数据进行有效的解析和处理,是当下前端开发中非常重要的知识点;尤其是vue/react开发的时候,我们都是在不断的操作数据,来控制视图的渲染,而操作的数据也是以对象和数组偏多;...
- 1)一维数组(只有一级结构)
let arr = [10, 20, 30];
let arr = [10, 'AA', true, null, undefined, Symbol(1)];
- 2)二维数组(多维数组) 有两级或者多级结构
let arr = [{
x: 100
}, {
y: 200
}];
2.如何学习数组
- 1.掌握基础操作
- 2.掌握数组中常用的内置方法(浏览器天生给数组提供的方法)
- 3.掌握数组排序和去重(算法)
1.获取数组中每一项的值; 或者对某一项进行操作
//ARR[索引]
let arr = [10, 20, 30];
console.log(arr[1]);//=>20
2.获取数组中的最后一项索引
//ARR.LENGTH - 1
let arr = [10, 20, 30];
console.log(arr.length-1);//=>2
3.向数组末尾追加一个新项
//ARR[ARR.LENGTH] = X
let arr = [10, 20, 30];
console.log(arr[arr.length]=40);
console.log(arr);//[10,20,30,40]
4.基于DELETE删除数组中的某一项(把它当做普通对象操作),键值对可以删掉,但是LENGTH并不会跟着改变,一般数组删除不用它!
let arr = [10, 20, 30];
console.log(delete arr[0]);
console.log(arr);//[empty,20 30]
5.基于ARR.LENGTH--可以实现删除数组中最后一项
let arr = [10, 20, 30];
console.log(arr.length--);
console.log(arr);//=>[10,20]
3.数组的内置方法
获取数组中的内置方法:console.dir(Array.prototype);
- 学习数组的官方网址: developer.mozilla.org/zh-CN/
- push:向数组末尾追加元素
/*
* @params:
* 参数个数不固定,类型也不固定,都是向数组末尾依次追加的内容
* @return:
* [NUMBER]新增后数组的长度
* 原始数据改变
*
* 基于对象键值对操作:arr[arr.length]=xxx
*/
let arr = [50, 60, 80, 90];
let result = arr.push(40, 60, "张三");
console.log(arr,result);
//=>[50, 60, 80, 90, 40, 60, "张三"] 7 (增加后的数组长度)
//返回的arr.[arr.length] 只对属性值(键值对)进行操作
- pop:删除数组最后一项
/*
* @params:无
* @return:
* 被删除的那一项内容
* 原始数组改变
*
* arr.length-- 删除最后一项
*/
arr = [50, 60, 80, 90];
result = arr.pop();
console.log(arr,result);//=>[50, 60, 80] 90
3.unshift:向数组开始位置新增内容
/*
* @params:
* 个数不定、类型不定,都是要依次新增的内容
* @return:
* [NUMBER]新增后数组的长度
* 原始数据改变
*/
arr = [50, 60, 80, 90];
result = arr.unshift(10,30);
console.log(arr,result);//=>[10,30,50, 60, 80, 90] 6
4.shift:删除数组中的第一项
/*
* @params:无
* @return:
* 被删除的那一项内容
* 原始数组改变
*/
arr = [50, 60, 80, 90];
result = arr.shift();
console.log(arr,result);//=>[60, 80, 90] 50
5.splice(n,m):从n索引开始删除到索引m个
/*
*arr.splice(n,m):从数组索引n开始,删除m个元素,返回结果是以新数组的方式,把删除的内容进行存储(m不写就是删除到末尾)
*arr.splice(n,m,x1,x2...):从索引n开始,删除m个元素,用x1(或者更多的值)替换删除的内容,返回结果是一个数组,存储删除的内容
*arr.splice(n,0,x1,x2...):从索引n开始,一个都不删除(返回结果是空数组),把x1或者更多值“插入到索引n的前面”
* 原始数组都会改变
*/
//splice(n,m):从n索引开始删除到索引m个
arr = [50, 60, 80, 9, 50, 60, 10];
result = arr.splice(2, 6);
console.log(arr, result);//=>[50, 60] (5) [80, 9, 50, 60, 10]
//splice(n,m,n1,n2):从n开始删除m个,在m初增加两个(写几个就增加几个yong逗号分隔)
arr = [50, 60, 80, 9, 50, 60, 10];
result = arr.splice(2, 6,(30),(10));
console.log(arr, result);//=>[50, 60, 30, 10] (5) [80, 9, 50, 60, 10]
//splice(n,0,n1,n2):从n开始删除0个,删除0个,一个都不删除,返回的结果是空数组,把n1或更多值插入到n的前面
let arr = [50, 60, 80, 9, 50, 60, 10];
result = arr.splice(2, 0,(30),(10));
console.log(arr, result);//=>[50, 60, 30, 10, 80, 9, 50, 60, 10] []
小案例:需求删除末尾这一项你有几种方法
let arr = [50, 60, 80, 9, 50, 60, 10];
let result=arr.pop();
console.log(arr, result);//=>[50, 60, 80, 9, 50, 60] 10
let arr = [50, 60, 80, 9, 50, 60, 10];
let result = arr.splice(arr.length - 1);
console.log(arr, result);//=>[50, 60, 80, 9, 50, 60] [10]
let arr = [50, 60, 80, 9, 50, 60, 10];
result=arr.length-1;
console.log(arr,result);//=>[50, 60, 80, 9, 50, 60, 10] 6
小案例:需求向数组末尾追加 "珠峰"
let arr = [50, 60, 80, 9, 50, 60, 10];
let result = arr.push("张三");
console.log(arr,result);//=>[50, 60, 80, 9, 50, 60, 10, "张三"] 8
let arr = [50, 60, 80, 9, 50, 60, 10];
arr[arr.length]="张三";
console.log(arr);//=>[50, 60, 80, 9, 50, 60, 10, "张三"]
let arr = [50, 60, 80, 9, 50, 60, 10];
arr.splice(arr.length, 0, '张三');
console.log(arr);//=>[50, 60, 80, 9, 50, 60, 10, "张三"]
6.slice(n,m):实现数组的查询,从索引n开始,查找到索引为m处(不包含m),把查找到的内容以新数组的方式返回,原始数组不变
//slice(n,m);从索引n查找到索引m 不包含m
let arr = [50, 60, 80, 9, 50, 60, 10];
let result=arr.slice(2,5)
console.log(arr,result);//=>[50, 60, 80, 9, 50, 60, 10] (3) [80, 9, 50]
//slice(n,m);从索引n查找,不写m,查找到末尾
let arr = [50, 60, 80, 9, 50, 60, 10];
let result =arr.slice(2);
console.log(arr,result);//=>[50, 60, 80, 9, 50, 60, 10] (5)[80, 9, 50, 60, 10]
//slice(0);写0 就是相当于复制了一份一模一样的,但是是不同的词组,不同的堆,但是堆中的内容是一样的
let arr = [50, 60, 80, 9, 50, 60, 10];
let result =arr.slice(0);
console.log(arr,result);//=>[50, 60, 80, 9, 50, 60, 10] (7)[50, 60, 80, 9, 50, 60, 10]
7.concat:实现数组拼接,把多个数组(或者多个值)最后拼接为一个数组,原始的数组都不会变,返回结果是拼接后的新数组
let arr1 = [50, 60, 80, 9, 50, 60, 10];
let arr2 = [10, 20, 30, 40];
let arr = arr1.concat(arr2);
console.log(arr);//=>[50, 60, 80, 9, 50, 60, 10, 10, 20, 30, 40]
8.把数组转换为字符串: toString():把数组中的每一项按照“逗号分隔”,拼接成对应的字符串
//原始数组不变
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.toString());//=>50,60,80,9,50,60,10
9.把数组转换为字符串:join([char]):指定分隔符
//原始数组不变
//join;转换成字符串和toString一样
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.join());//=>50,60,80,9,50,60,10
//join;转换成字符串,然后有用+号连接
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.join("+"));//=>50+60+80+9+50+60+10
let str=arr.join("+");
let total=eval(str);
console.log(total);
let total=0;
for(let i=0;i<arr.length;i++){
total=total+arr[i];
}
console.log(total)
10.获取数组中指定项的索引:indexOf([item]);获取数组中的某一项第一次出现是在索引的那个位置
//原始数组不变
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.indexOf(90));//=-1 没有值返回-1
console.log(arr.indexOf(80));//=2
11.获取数组中指定项的索引:lastIndexOf([item]) :获取当前项在数组中最后一次出现位置的索引
//原始数组不变
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.lastIndexOf(50));//=>4 arr中最后一次出现50是索引4
console.log(arr.indexOf(1));//=>-1 arr中没有数字1 没有返回-1
- 获取数组中指定项的索引:includes:验证数组中是否包含这一项,返回TRUE/FALSE
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr. includes(50));//=>true
console.log(arr. includes(1));//=>false
//基于以上这个特征来验证是否包含某一项
let arr = [50, 60, 80, 9, 50, 60, 10];
if(arr.indexOf(40)>-1){
//数组中包含这一项做什么事情
}
console.log(arr.includes(40));//=>false
console.log(arr.includes(50));//=>true
13 reverse:把原始数组倒过来排列,返回的结果是排列后的原始数组,原始数组改变
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.reverse());//=>[10, 60, 50, 9, 80, 60, 50]
14 sort:把原始数组按照规则进行排序,原始数组会改变(返回结果也是改变后的原始数组)
- SORT支持传递回调函数,基于自定义的排序规则,进行排序的
// sort;排序 但是这个是每一位数对比,实现比了正确的排序
let arr = [50, 60, 80, 9, 50, 60, 10];
console.log(arr.sort());//=> [10, 50, 50, 60, 60, 80, 9]
//从小到大排序
let arr = [50, 60, 80, 9, 50, 60, 10];
arr.sort (function(a,b){
return a-b;
});
console.log(arr);//=>[9, 10, 50, 50, 60, 60, 80]
//从大到小排序
let arr = [50, 60, 80, 9, 50, 60, 10];
arr.sort(function (a, b) {
return b - a;
});
console.log(arr);//=>[80, 60, 60, 50, 50, 10, 9]
15 数组中常用的迭代方法(遍历数组中每一项的) : forEach([函数]):遍历数组中的每一项(数组中有多少项,函数会相继被执行多少次),每一次执行函数,都可以在函数中获取到当前遍历的这一项和对应的索引
//forEach:遍历数组中的每一项,数组求和
let arr = [50, 60, 80, 9, 50, 60, 10];
//数组求和的方式
console.log(arr.join("+"));//=>50+60+80+9+50+60+10
let total=0;
arr.forEach(function(item,index){
item=Number(item);
if(!isNaN(item)){
total=total+item;
}
})
console.log(total);//=>319
//分析
arr.forEach(function(item,index){
//此函数会被循环执行五次(数组中有五项)
//item:当前便利这一项的内容
//index:当前项的索引
//检测当前项是不是数字
item=Number(item);
//当前项如果是数字,则和total相加
if(!isNaN(item)){
total=total+item;
}
})
console.log(total);
16 数组中常用的迭代方法(遍历数组中每一项的):: map:forEach是不支持返回值的,而map可以在forEach的基础上支持返回值,把原来数组中每一项的值替换成为新值,最后存储在一个新的数组中,但是原始数组是不变的
let arr = [50, 60, 80, 9, 50, 60, 10];
let result=arr.map(function(item,index){
//数组中有五项,此函数执行了5次
//item:当前循环索引这一项的值
//index:当前值对应的索引
//循环每一项,都乘以10,作为返回结果
return item*10;
});
console.log(arr,result);
//=>[50, 60, 80, 9, 50, 60, 10] (7)[500, 600, 800, 90, 500, 600, 100]