创建数组
let arr = new Array(1,2,3)等价于let arr=(1,2,3)
let arr = new Array(3) 即是创建一个长度为三的数组
转化: let arr='1,2,3' 可以用arr.split(','),即用逗号分隔开创建数组
let arr='1,2,3'
arr.split(',')
// ['1', '2', '3']
let arr='123' 可以用arr.split(''),即用空字符串分隔开创建数组
let arr1='123'
arr1.split('')
// ['1', '2', '3']
Array.from('123')将不是数组的东西变成数组
Array.from('123')
// ['1', '2', '3']
伪数组的原型链中并没有数组的原型,它的原型直接指向对象的原型
没有push之类数组所共有的属性那就是伪数组,此时就可以用Array.from()来将其变成数组
注意:碰到到伪数组那就立刻转换为数组
两个数组合并变成新数组:arr1.concat(arr2) concat连接,返回一个新数组,原有数组不变
let arr1=[1,2,3,4]
let arr2=[7,8,9]
arr1.concat(arr2)
// [1, 2, 3, 4, 7, 8, 9]
截取一个数组的一部分:arr.slice(2) 切掉前2个,不会改变原数组
let arr1=[1,2,3,4]
arr1.slice(2)
// [3, 4]
arr1
// [1, 2, 3, 4]
arr.slice(0) 切掉前0个,即保留截取所有元素。常用来复制数组。
arr1.slice(0)
// [1, 2, 3, 4]
JS只提供浅拷贝
增删改查数组中的元素
删
- 不会改变长度
- delete
let arr=['a','b','c']
delete arr[0]
- 改变数组的length可以删掉数组 删掉之后就会删掉'a',但不会改变长度,这两种都不推荐
- 会改变长度
- 删掉头部:arr.shift() arr 被修改,并返回被删元素
- 删掉尾部:arr.pop() arr 被修改,并返回被删元素
- 删掉中间的:arr.splice(下标,个数) 从下标的地方包括该元素,删掉几个元素,并返回被删元素
- arr.splice(下标,个数,改成什么) 从下标的地方包括该元素,删掉几个元素,并改成什么元素,并返回被删元素
arr.splice(5,1,6666,777,888)删掉下标为5的元素,只删一个,并且在该位置添加6666,777,888
let arr=[1,2,3,4,5,6,7,8]
arr.splice(5,1,6666,777,888)
// [6]
arr
// [1, 2, 3, 4, 5, 6666, 777, 888, 7, 8]
let arr1=[1,2,3,4,5,6,7,8,9,0]
arr1.splice(2,3,6666,777,888)
// [3, 4, 5]
arr1
// [1, 2, 6666, 777, 888, 6, 7, 8, 9, 0]
arr1.splice(2,3,'x')
// [6666, 777, 888]
arr1
// [1, 2, 'x', 6, 7, 8, 9, 0]
查
let arr=[1,2,3,4,5,6,7,8]
for(let i=0; i<arr.length;i++){
console.log(`${i}:${arr[i]}`)
}
// 0:1
// 1:2
// 2:3
// 3:4
// 4:5
// 5:6
// 6:7
// 7:8
arr.forEach(function(xxx,yyy){
console.log(`${yyy}:${xxx}`)
})
相当于
function forEach(array,fn){
for(let i=0; i<arr.length;i++){
fn(array[i],i)
}
forEach(['a','b','c'],function(x,y){
console.log(x,y)})
将当前参数、下标、数组本身都打印出来
function forEach(array,fn){
for(let i=0; i<arr.length;i++){
fn(array[i],i,array)
}
forEach(['a','b','c'],function(x,y,z){
console.log(x,y,z)})//将当前参数、下标、数组本身都打印出来
区别是什么 问到该问题的时候 就要回答他能做到另一个不能做到的情况
第一种随时可以用break或者continue停止,forEach只要执行就无法中止。for循环是关键字,没有块级作用域,forEach是函数,是函数作用域
- 查看单个属性
- 查找某个元素是否在数组里
- arr.indexOf(item) 存在返回索引,否则返回-1
- 使用条件查找元素
- arr.find(function(x){return x%5===0)}//写符合的某个条件,只会返回第一个符合条件的元素
- arr.findIndex(function(x){return x%5===0)}//写符合的某个条件,返回第一个对应的元素下标
增
- 在尾部添加 arr.push
arr1.push('a','b','c')
// 7
arr1
// [1, 2, 3, 4, 'a', 'b', 'c']
- 在头部添加 arr.unshift
arr1.unshift(0)
// 8
arr1
// [0, 1, 2, 3, 4, 'a', 'b', 'c']
改
- 反转顺序arr.reverse() // 会直接修改原数组
- 面试题:如何把字符串换位置 s.split('').reverse().join('')先分开成为字符串,再反转,再合并起来
let s='abcde'
// undefined
s.split('')
// ['a', 'b', 'c', 'd', 'e']
s.split('').reverse()
// ['e', 'd', 'c', 'b', 'a']
s.split('').reverse().join('')
//'edcba'
- 自定义顺序
- 排序
- arr.sort() 会从小到大自动排列,等价于arr.sort((a,b)=>a-b)
arr.sort((a,b)=>b-a)即从大到小
-
arr.sort((a,b)=>a.score-b.score)
-
arr.sort((a,b)=>a-b)
let stu=[{name:'a',score:12},{name:'b',score:34},{name:'c',score:87},{name:'d',score:99}]
// undefined
stu.sort((a,b)=>a.score-b.score)
// 0: {name: 'a', score: 12}
// 1: {name: 'b', score: 34}
// 2: {name: 'c', score: 87}
// 3: {name: 'd', score: 99}
// length: 4
stu.sort((a,b)=>b.score-a.score)
// 0: {name: 'd', score: 99}
// 1: {name: 'c', score: 87}
// 2: {name: 'b', score: 34}
// 3: {name: 'a', score: 12}
// length: 4
let arr=[1,2,3,4,5,6,7,8]
arr.sort((a,b)=>b-a)
// [8, 7, 6, 5, 4, 3, 2, 1]
let arr=[1,2,3,4,5,6,7,8]
arr.sort((a,b)=>a-b)
// [1, 2, 3, 4, 5, 6, 7, 8]
- 数组变换
- map n 变 n
arr
// [1, 2, 3, 4, 5, 6, 7, 8]
arr.map(item=>item*item)
// [1, 4, 9, 16, 25, 36, 49, 64]
arr.map(item=>item-1)
// [0, 1, 2, 3, 4, 5, 6, 7]
- fliter n 变少
arr.filter(item=>item%2==0)
// [2, 4, 6, 8]
- reduce n变1
arr.reduce((sum,item)=>{return sum+item},0)
// 36
可以简化sum操作,0为sum的初始值,可以代替map
arr.reduce((result,item)=>{return result.concat(item*item)},[])
// [1, 4, 9, 16, 25, 36, 49, 64]
代替fliter
arr.reduce((add,item)=>{
if (item%2==1){return add}
else{return add.concat(item)}
},[])
// [2, 4, 6, 8]
简化
arr.reduce((add,item)=>
add.concat(item % 2==1 ? [] :item),[])
课后作业
- 输出60分以上学生成绩
let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let scores2 = scores.filter(item=>item>=60)
console.log(scores2) // [95,91,82,72,85,67,66, 91]
- 将0-6转换为周一到周日
let arr = [0,1,2,2,3,3,3,4,4,4,4,6]
let arr2 = arr.map((i)=>{
const hash = {0:'周日',1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六'}
return hash[i]
})
console.log(arr2)
- 算出奇数之和
let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let sum = scores.reduce((sum, n)=>{
if(n%2==1){
return sum+n
}else{
return sum
}
},0)
console.log(sum) // 奇数之和:598
简化版本
let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let sum = scores.reduce((sum, n)=>{
return n%2===0?sum:sum+n
},0)
console.log(sum) // 奇数之和:598
代码
// 在数组末尾添加
var arr = [1, 2, 3];
arr.push(4, 5, "pink");
console.log(arr);
// 在数组前边添加
arr.unshift("red");
console.log(arr);
// 删除数组的最后一个元素
arr.pop();
console.log(arr);
// 删除第一个
arr.shift();
console.log(arr.shift());
console.log(arr);
// 翻转数组
var arr = [1, 2, 3, 4];
arr.reverse();
console.log(arr);
// 数组排序 冒泡排序 升序
var arr1 = [19, 2, 6, 3, 4];
arr1.sort(function (a, b) {
return a - b;
});
console.log(arr1);
// 数组排序 冒泡排序 降序
var arr1 = [19, 2, 6, 3, 4];
arr1.sort(function (a, b) {
return b - a;
});
console.log(arr1);
// 返回数组的索引号 只返回第一个满足的索引号,如果找不到则返回-1
var arr2 = ["yellow", "pink", "orange", "blue"];
console.log(arr2.indexOf("yellow"));
// 数组转换为字符串 方法一
var arr3 = [1, 2, 3];
console.log(arr3.toString());
// 数组转换为字符串 方法二
var arr4 = ["yellow", "pink", "blue"];
console.log(arr4.join());
console.log(arr4.join("-"));
console.log(arr4.join("&"));
// concat() 连接两个或多个数组,不影响原数组 返回一个新的数组
console.log(arr4.concat(arr3));
// slice() 数组截取slice(begin, end) 返回被截取的新数组
var arr2 = ["yellow", "pink", "orange", "blue"];
console.log(arr2.slice(1, 2));
// splice() 数组删除splice(第几个开始,要删除的个数) 返回被删除项目的新数组
var arr5 = ["a", "b", "c", "d", "e", "f", "g"];
console.log(arr5.splice(0, 3));