J15 数组中常用的方法

104 阅读10分钟

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

  1. 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] 只对属性值(键值对)进行操作
  1. 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
  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]