js数组进阶
# 1.数组方法
unshift 前增 返回新数组长度
push 后增 返回新数组长度
shift 前删 返回删除的元素
pop 后删 返回删除的元素
splice 任意位置的增删改查(位置索引,删除的个数,新增元素1,新增元素2) 返回删除的元素组成的新数组
concat 合并
# 1.push
作用:末尾增加元素
返回值:数组的新长度
特点:修改原数组
语法:
arr.push()
案例:
let arr = [100,200]
console.log(arr.push(300,400,500)); //5
console.log(arr); //[100, 200, 300, 400, 500]
2
3
4
# 2.pop
作用:末尾删除元素
返回值:被删除的元素
特点:要修改原数组
语法:
arr.pop()
案例:
let arr = [100,200]
console.log(arr.pop()); //200
console.log(arr); //[100]
2
3
4
# 3.unshift
作用:前面增加元素
返回值:数组的新长度
特点:要修改原数组
语法:
arr.unshift()
案例:
let arr = [100,200]
console.log(arr.unshift(30,50)); //4
console.log(arr); // [30, 50, 100, 200]
2
3
4
# 4.shift
作用:前面删除元素
返回值:被删除的元素
特点:要修改原数组
语法:
arr.shift()
案例:
let arr = [100,200]
console.log(arr.shift()); //100
console.log(arr); //[200]
2
3
# 5.splice
作用:在任意位置 增加 删除 替换元素
返回值:被删除的元素组成的数组
特点:要修改原数组
语法:
arr.splice(索引位置,删除掉元素个数,新增的元素值1,新增元素值2,新增····)
案例:
let arr = [100,200,300,400,500]
consolelog(arr.splice(1,1)); //[200]
console.log(arr); //[100, 300, 400, 500]
2
3
let arr = [100,200,300,400,500]
arr.splice(1,1,1000,2000); //[200]
console.log(arr); //[100,1000,2000, 300, 400, 500]
2
3
let arr = [100,200,300,400,500]
arr.splice(1,0,1000,2000); // []
console.log(arr); //[100,1000,2000, 200,300, 400, 500]
2
3
let arr = [100,200,300,400,500]
arr.splice(2,2); //[300,400]
console.log(arr); //[100,200,500]
2
3
# 6.concat
作用:将后面数组的元素 合并 到数组1上
返回值:合并后的新数组
特点:不改变原数组
语法:
数组1.concat(数组2,数组3)
let 合并后的新数组 = 原数组.concat(数组2,数组3)
2
案例:
let arr = [100,200,300,400,500]
let arr1 = [1000,2000]
let arr2 = [3000,4000]
// 合并
let newArrr = arr.concat(arr1,arr2)
console.log(newArrr);//[100, 200, 300, 400, 500, 1000, 2000, 3000, 4000]
console.log(arr); // [100,200,300,400,500]
console.log(arr1); //[1000,2000]
console.log(arr2); //[3000,4000]
2
3
4
5
6
7
8
9
10
# 阶段练习:
let userList = [
{ sno:100,name: '罗美洁', gender: "女", age: 21 },
{ sno:101,name: '彭代晶', gender: '男', age: 22 },
{ sno:105,name: '陈玉婷', gender: '女', age: 23 }
]
let userList1 = [
{ sno:107,name: '刘玉清', gender: "女", age: 22 },
]
//1.请添加张敏敏102 刘欢104
let user1 = { sno: 102, name: '张敏敏', gender: "女", age: 21 }
let user2 = { sno: 104, name: '刘欢', gender: "男", age: 21 }
userList.splice(2, 0, user1,user2)
console.log(userList);
//2.请修改 101的同学 年龄:23
//方法一
userList[i].age=23;
//方法二
let user3 = { sno: 101, name: '彭代晶', gender: '男', age: 23 }
userList.splice(1, 1, user3)
console.log(userList);
//3.请在尾部添加 106徐练 信息
let user4 = { sno: 106, name: '徐练', gender: "女", age: 21 }
userList.push(user4)
console.log(userList);
//4.请删除 106同学的信息
userList.pop()
console.log(userList);
//5.请在前面添加一个 99 徐练
userList.unshift(user4)
console.log(userList);
//6.请删除最前面的 99徐练的信息
userList.shift()
console.log(userList);
//7.请合并另userList1 数组到 userList 中 ,打印输出userList
userList = userList.concat(userList1)
console.log(userList);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 7.forEach
数组遍历,单纯数组遍历,跟for循环效果完全一样,只是for的简写
特点:不改变原数组
let arr = [1,2,3]
arr.forEach(function(item,index){
arr1.
})
2
3
4
# 8.map
数组遍历,返回一个新数组
特点:不改变原数组
let arr = [1,2,3]
let arr1 = arr.map(function(item,index){
return item+1000;
})
2
3
4
# 9.filter 过滤-数组的遍历
数组过滤,建立数组,返回满足条件的元素,组成一个新数组
特点:不改变原数组
let arr = [1,2,3,-1]
let arr1 = arr.filter(function(item,index){
return item>0;
})
2
3
4
# 练习
<script>
let userList = [
{ sno: 100, name: '罗美洁', gender: "女", age: 21 },
{ sno: 101, name: '彭代晶', gender: '男', age: 22 },
{ sno: 102, name: '陈玉婷', gender: '女', age: 23 },
{ sno: 103, name: '张敏敏', gender: '女', age: 18 },
{ sno: 104, name: '苏鹏', gender: '男', age: 20 },
{ sno: 105, name: '豆江涛', gender: '女', age: 22 }
]
//1.请遍历该数组,返回一个新数组,给每个同学都加上一个属性 成绩:80分 num:80
let userList1 = userList.map(function (item, index) {
return { ...item, num: 80 };
})
console.log(userList1);
//2.请删选出该班级的男同学信息,用新数组展示
let userList2 = userList1.filter(function (item, index) {
return item.gender === '女';
})
console.log(userList2);
//3.请删选出年龄在21及以上的同学信息
let userList3 = userList1.filter(function (item, index) {
return item.age >= 21;
})
console.log(userList3);
//4.请修改所有同学的学号,在原有的基础上 前面加上 '219980'+原来的学号,返回一个新数组展示
let userList4 = userList.map(function (item, index) {
return {...item,sno: '219980' + item. sno} ;
})
console.log(userList4);
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 10.find
查找满足条件的元素,并返回满足条件的第一个元素,如果没有找到返回 undefined
特点:不改变原数组
arr.find(function(item,index){
return 条件;
})
2
3
# 11.findIndex
查找满足条件的元素,并返回 满足条件的第一个元素的 索引,如果没有找到 返回 -1
特点:不改变原数组
arr.findIndex(function(item,index){
return 条件;
})
2
3
# 12.indexOf
查找相同的元素,并返回 相同元素的 第一个元素的索引,如果没有找到 返回 -1
特点:不改变原数组
arr.indexOf(需要查找的元素)
# 13.lastIndexOf
从后面往前面找 查找相同的元素,并返回相同的 最后一个元素的索引,如果没有找到 返回 -1
特点:不改变原数组
arr.lastIndexOf(需要查找的元素)
# 案例
let nums = [-1, 100,3, 200, 6, 15, 18, 23, 22];
// 请查找出该数组中 第一个正数是多少?
let num = nums.find(function (item, index) {
return item > 0;
})
console.log('第一个正数是', num);
//请查找出该数组中 能够整除3的第一个元素
let num1 = nums.find(function (item, index) {
return item % 3 == 0;
})
console.log('能够整除3的第一个元素 ', num1);
// 请查找出该数组中 能够整除3的第一个元素的索引
let num2 = nums.findIndex(function (item, index) {
return item % 3 == 0;
})
console.log('能够整除3的第一个元素的索引 ', num2);
//请查找出该数组中能够整除10的第一个元素的索引
let num3 = nums.findIndex(function (item, index) {
return item % 10 == 0;
})
console.log('整除10的第一个元素的索引 ', num3);
// 请查找出该数组中 等于-1的元素索引
// let num4 = nums.findIndex(function(item,index){
// return item==-1;
// })
let num4 = nums.indexOf(-1);
console.log('等于-1的元素索引 ', num4);
// 请查找出该数组中 等于1000的元素的索引
let num5 = nums.indexOf(1000)
console.log(num5);
// 请查找出该数组中第一个质数的索引
// 除了1和本身以外 不能被其他数字整除的正整数
let num6 = -1;
//循环这个数组 :判断该元素是否是一个正数
// 2--这个数字-1 :判断该元素是否可以有一个整除的数字,
// 如果有:不是质数 结束当前循环
// 如果这个循环运行到了最后一次 都没有找到整除的数字, 结束所有的循环 返回最终数字
for(let i =0;i<nums.length;i++){
if(nums[i]>0){
// 假设这个数字是质数 状态
let status = true;
for(let j=2;j<nums[i];j++){
// 如果找到一个能够整除的数字,结束当前循环
if(nums[i]%j ==0){
status=false;
break;
}
}
//如果一直没有找到整除的数字,质数
if(status==true){
num6 = i; //将质数索引复制给num6
break;
}
}
}
console.log(num6);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 练习:
let userList = [
{ sno: 100, name: '罗美洁', gender: "女", age: 21 ,num:40},
{ sno: 101, name: '彭代晶', gender: '男', age: 22 ,num:20},
{ sno: 102, name: '陈玉婷', gender: '女', age: 23 ,num:67},
{ sno: 103, name: '张敏敏', gender: '女', age: 18,num:83 },
{ sno: 104, name: '苏鹏', gender: '男', age: 20,num:88 },
{ sno: 105, name: '豆江涛', gender: '女', age: 22,num:99 }
]
//请查找出 学号为103 的同学的信息
let userList1 = userList.find(function(item,index){
return item.sno = 103
})
console.log(userList1);
//请查找出 学号为100的同学的性别
let userList2 = userList.find(function(item,index){
return item.sno = 100
})
console.log(userList2.gender);
//请查找出及格的第一个同学的信息
let userList3 = userList.find(function(item,index){
return item.num > 60
})
console.log(userList3);
//请查找出年龄为20的 同学的索引序号
let userList4 = userList.findIndex(function(item,index){
return item.age === 20
})
console.log(userList4);
//请查找出 分数为80-90分分段的第一一个同学的索引序号
let userList5 = userList.find(function(item,index){
return item.num > 80 &&item.num < 90
})
console.log(userList5);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 14.includes 包含
查找数组中 是否 包含 某个元素,如果包含返回:true 不包含:false
特点:不改变原数组 【字符串可以共用这个方法】
arr.includes(需要查找的元素)
let arr = [200,300,600]
arr.includes(200) //true
arr.includes(500) //false
arr.includes(200) && arr.includes(300) //同时查找
2
3
4
5
6
# 15.some 一些
判断 是否 至少有一个元素满足 条件,如果有返回true, 一个满足条件的元素都没有返回:false
arr.some(function(item,index){
return 条件
})
2
3
let arr = [100,200,300,-1,-100];
let status = arr.some(function(item,index){ //true
return item>0;
})
2
3
4
# 16.every 所有
判断 是否 所有的元素都满足条件,如果都满足返回true ,否则:false
arr.every(function(item,index){
return 条件
})
2
3
4
let arr = [100,200,300,-1,-100];
let status = arr.every(function(item,index){ //false
return item>0;
})
2
3
4
# 17.join
将数组转换为 字符串 ,且以分隔符分割
将字符串转换为数组,且以分隔符分割 split
//将,改为;
let str = '张三,李四,王五,黄四郎'
//将字符串转为数组
let strArr = str.split(',') //['张三','李四','王五','黄四郎']
//将数组转为字符串
let str1 = strArr.join(';') //'张三;李四;王五;黄四郎'
2
3
4
5
6
7
# 18.slice
数组的截取,和字符串截取功能完全一样,返回一个截取出来的新数组
arr.slice(起始索引)
arr.slice(起始索引,结束索引) //左闭右开 包含起点 不包含终点 索引可以为负数,为负数:倒数第几个
2
3
let arr = [100,200,3003,44,5,5,3,3];
//请截取索引为4的后面所有元素
let arr1 = arr.slice(4) //[5,5,3,3]
//索引2-4之间的两个元素
let arr2 = arr.slice(2,4) //[3003,44]
//截取 倒数第4个到倒数第2个元素
let arr3 = arr.slice(-4,-2); //[5,5]
2
3
4
5
6
7
8
# 19.reduce 求和求积
求和求积 ,遍历整个数组,将每一项的元素的值进行累加或累乘 返回计算完成之后的结果 数字
arr.reduce(function(pre,next){},初始值) //初始值:累加 0 ,累乘:1 pre:上一次计算完成后的值 next:下一次参与计算的元素
let arr = [100, 2003, 3, 34, 3, 43, 43, 4]
let sum = arr.reduce(function (pre, next) {
return pre + next; //上一次计算完成后的结果 + 下一次参与运算的元素的值
}, 0)
console.log(sum) //2233
let goods = [
{ money: 11 },
{ money: 22 },
{ money: 30 }
]
let totalMoney = goods.reduce(function (pre, next) {
return pre * next.money;
}, 1)
console.log(totalMoney); //7260
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 20.sort
排列数组的顺序,升序 降序
不传递数据: 只对数字数组排序有效
特点:会修改原数组
不传值: 只支持 纯字符串
arr.sort() //不传值 从小到大
数字的排序 或者 对象的属性排序
arr.sort(function(a,b){ //a:前一个元素|小的元素 b:后一个元素|大的元素
return a - b; // - :不是算数运算的减法, xxx到xxxx 从小到大
})
arr.sort(function(a,b){ //a:前一个元素|小的元素 b:后一个元素|大的元素
return b - a; // - :不是算数运算的减法, xxx到xxxx 从大到小
})
2
3
4
5
6
7
8
let arr = [-1, 100, 200, -3, 5];
arr.sort(function (a, b) {
return a - b;
})
console.log(arr); // [-3, -1, 5, 100, 200]
let arr1 = ['B', 'a','AA', 'b', 'c', 'A', 'aA', 'AB'];
arr1.sort()
console.log(arr1); // [-3, -1, 5, 100, 200]
let goods = [
{ money: 119 },
{ money: 22 },
{ money: 300 },
{ money: 1 }
]
// a:前一个元素 小 b:后一个元素 大
goods.sort(function(a,b){
return a.money - b.money
})
console.log(goods);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 21.flat 拉平
将多维数组 转换为 低位数组
特点:不改变原数组
arr.flat(数字/无限层) 数字:需要拉平的层数 无限层(未知层数):Infinity 返回一个一维数组
let arr =[[[[1,2],3,4],[[[[[5,6],[7,8]]]]]]];
let arr1 = arr.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8]
console.log(arr1);
2
3
4
# 22.reserve 反向
将数组反向输出
特点:改原数组
arr.reverse()
let arr = [100,200,300]
arr.reverse(); //[300,200,100]
2
//字符串从大到小
let arr1 = ['B', 'a','AA', 'b', 'c', 'A', 'aA', 'AB'];
arr1.sort().reverse()
console.log(arr1); ['c', 'b', 'aA', 'a', 'B', 'AB', 'AA', 'A']
2
3
4
# 作业
let goods = [
{id:10033,name:'iphone 15',price:6000},
{id:10011,name:'华为mate60',price:4500},
{id:10022,name:'小米11pro',price:3200},
]
//1.请将该数组以id进行升序排序
//2.请添加一个真实售价信息 nowPrice 为原有价格的9.5折
//3.请查找出价格符合4000-5000的手机信息
//4.请添加一个新数据,id为110044,商品名是'oppo 10 plus ',价格为2800,并通过代码修改该商品的真实售价9.5折
//5.该商品列表中是否包含 'iphone 14 max' 的手机?
//6.如果我需要购买该商品列表中的所有商品,一共需要消费多少?
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24