新建数组
let array = [1,2,3] //简写形式
let array = new Array(1,2,3)
转化
1、 通过字符串创建数组
let str = '1,2,3'
str.split(',') //split用什么来分割这个字符串
2、 空字符串创建数组
let str = '123'
str.split('') //split用什么来分割这个字符串
3、不是数组的东西转化成数组
要符合两个条件
- 对象要有0,1,2,3的
下标 - 要有
length属性
Array.from({0:'a',1:'b',2:'c',length:3})
伪数组
伪数组的原型链中并没有数组的原型
let divList = document.querySelectorAll('div')
let divArray = Array.from(divList)
console.dir(divArray)
//拿到一个伪数组都需要将他转化成数组先
合并两个数组(concat)
concat
let arr3 = [3,3,3]
let arr4 = [4,4,4]
arr3 = arr4.concat()
arr3.concat(arr4) //concat 连接的意思
//得到新数组 ,不会返回原来的东西
字符串转换成数组(join)
join
// 变成数组
let str = '456'
let str = arr.join('')
console.log(str) // '456'
let str2 = arr.join('-')
console.log(str2) // '4-5-6'
截取数组的一半
let arr5 = [1,2,3,4,5,6,7,8,9]
arr5.slice(2)//slice 切的意思,意思是从0,1,2,开始切,得到3456789
//slice(0) 相当于复制一个数组,浅拷贝
let arr6 = arr5.slice(0)
=>(9),{1,2,3,4,5,6,7,8,9}
删除数组
不推荐删法
let arr = ['a','b','c']
delete arr[0] //删delete不推荐
arr
=> (3),{empty,"b","c"} //数组的长度并没有变
delete arr[1]
delete arr[2]
=> (3),{empty x 3} //没有下标,但是有长度,叫稀疏数组
删length 不推荐
let arr = [1,2,3,4]
arr.length = 2
=>(2),{1,2}
数组方法栈、队列方法(pop、push、shift、unshift)
删除头部的元素
arr.shift() // arr被修改,并返回被删元素
let arr2 = [1,2,3]
arr2.shift() //shift 作用吧最前面的数字顶出去
=>1
arr2
=>(2),{2,3} //删除之后长度变了
添加头部的元素
arr.unshift( ) // arr被修改,并返回添加元素
arr.unshift(10)
console.log(arr) //[10, 3, 4, 'hello', true, 100]
添加尾部的元素
arr.push( )// arr被修改,并返回添加元素
arr.push(100)
console.log(arr) //[3, 4, 'hello', true, 100]
删除尾部的元素
arr.pop() // arr被修改,并返回被删元素
let arr3 = [1,2,3]
arr3.pop()
=>3
arr3
=>(2),{1,2} //删除之后长度变了
数组方法(splice)
任意位置添加、删除(会改变原数组)
参数: 1.开始索引(插入在前);2.删除元素的个数;3.插入的新元素,可以写多个
返回:一个由删除元素组成的新数组
删除中间的元素
arr.splice(index,1)
//删除index中的一个元素,index表示删哪个,在第几个,1,表示删一个
let arr5 = [1,2,3,4,5,6,7,8]
arr5.splice(2,3)
=>(3),{3,4,5}
arr5
=>(5),{1,2,6,7,8}
//从1开始删除2个元素
let arr = [3, 4, 'hello', true, 8]
arr.splice(1, 2) //[4, 'hello']
console.log(arr) //[3, true, 8]
插入一个元素
// 插入1个元素
let arr1 = [3, 4, 'hello', true, 8]
arr1.splice(1, 0, 'world') // 不删除数组时,在下标前面插入
console.log(arr1) // [3, 'world', 4, 'hello', true, 8]
删除中间的元素并添加一个元素
arr.splice(index,1,'x') //删除一个元素,并在删除位置添加'x'
let arr6 = [1,2,3,4,5,6,7]
arr6.splice(5,1,666)
=>6
arr6
=>(7),{1,2,3,4,5,666,7}
//替换
let arr2 = [3, 4, 'hello', true, 8]
arr2.splice(2, 2, 'world', false) //从第2个下标开始删并添加
console.log(arr2) // [3, 4, world, false, 8]
查看所有元素
查看属性名的方法
let arr = [1,2,3,4,5]
arr.x = 'x'
=>x
Obejct.keys(arr)
=>(6),{1,2,3,4,5,x}
查看属性值的方法
${} //意思是可以插入一个变量
For 循环
let arr = [1,2,3,4,5]
for (let i = 0;i < arr.length;i++){
console.(i) //打出属性名
}
for(let i = 0;i < arr.length;i++){
console.log(' ${i} : ${arr[1]} ') //查看所有的key 和属性值
}
=> 0:1
1:2
ForEach
arr.foreach (function(item,index){
console.log('${item} : ${index}')
}
查找某个元素是否在一个数组
arr.indexof() //存在返回索引,否则返回-1,查找某个元素的下标
let arr = [1,12,34,112,31]
arr.indexof(13)
=>-1 //-1表示不再这个数组里,存在会标出下标
arr.indexof(1)
=>0
查找符合这个条件的第一个元素
arr.find(item=>item % 2===0) //找第一个偶数
let arr = [12,45,1]
arr.find(function(x){
return x%5===0
})
=>45
使用条件找到该元素的索引
findeIndex:返回对应的元素的下标
arr.findIndex(item=>item % 2===0) //找第一个偶数的索引
arr.findIndex(function(x){
return x%5===0
})
=>1
增加数组中的元素
在尾部添加元素
arr.push() //修改arr,返回新长度
let arr = [1,2,3,4,5,6]
arr.push(9)
=>7
arr
=>(7),[1, 2, 3, 4, 5, 6, 9]
arr.push('a','b','c')
=>10
=>(10), [1, 2, 3, 4, 5, 6, 9, "a", "b", "c"]
在头部添加元素
arr.unshift()//修改arr,返回新长度
arr.unshift(11)
11
arr
=>(11),[11, 1, 2, 3, 4, 5, 6, 9, "a", "b", "c"]
arr.unshift('x','y','z')
=>14
arr
=>(14),["x", "y", "z", 11, 1, 2, 3, 4, 5, 6, 9, "a", "b", "c"]
在中间添加元素
arr.splice() //修改arr,返回新长度
arr.splice(9,0,9.9) //9表示在第九个的位置,0表示一个都不删,9.9表示添加的数字
arr
=>15,["x", "y", "z", 11, 1, 2, 3, 4, 5, 9.9, 6, 9, "a", "b", "c"]
修改数组
arr[]=xxx //在对应的位置输入要修改的数字
arr.splice(x,1,xxx) //在x个位置,删掉一个数字,添加一个xxx,既修改的意思
反转序列
arr.reverse() //修改原数组
let arr = [1,2,3,4,5,6,7,8]
arr.reverse()
=>(8),[8, 7, 6, 5, 4, 3, 2, 1]
arr
=>(8),[8, 7, 6, 5, 4, 3, 2, 1]
let str = 'hello jirengu'
str = str.split('').reverse().join('');
console.log(str)
- 字符串的反转
var s = 'abcde'
s.split('')
=>(5),["a", "b", "c", "d", "e"] //先变成数组
s.split('').reverse()
=>(5),["e", "d", "c", "b", "a"] //反转
s.split('').reverse().join('') //再变回字符串
=>"edcba"
修改序列
arr.sort() // sort 默认排序顺序是在将元素转换为字符串
arr1 = [1, 30, 4, 21, 100]
arr1.sort((a, b) => a-b) //从小到大 [1, 4, 21, 30, 100]
arr1 = [1, 30, 4, 21, 100]
arr1.sort((a, b) => b-a) //从大到小 [100, 30, 21, 4, 1]
let arr = [2,3,5,4,1]
arr.sort()
=>(5),[1, 2, 3, 4, 5]
arr.sort(function(a,b){
if(a>b){
return 1 // 1表示前面一个大
}else if(a === b){
return 0 //0表示一样大
}else{
return -1} //-1表示后面一个大
})
=>(5),[1, 2, 3, 4, 5]
例子
let arr = [
{name:'小明',score:99}, {name:'小红',score:95}, {name:'小蓝',score:100}
]
arr.sort()
=>(3) [{…}, {…}, {…}]
0: {name: "小明", score: 99}
1: {name: "小红", score: 95}
2: {name: "小蓝", score: 100}
length: 3
__proto__: Array(0)
arr.sort(function(a,b){
if(a.score > b.score){return 1}
else if(a.score === b.score){return 0}
else {return -1}
})
=>(3) [{…}, {…}, {…}]
0: {name: "小红", score: 95}
1: {name: "小明", score: 99}
2: {name: "小蓝", score: 100}
length: 3
__proto__: Array(0)
↑ 等同于 ↓
arr.sort((a,b) =>a.score - b.score)
=>(3) [{…}, {…}, {…}]
0: {name: "小红", score: 95}
1: {name: "小明", score: 99}
2: {name: "小蓝", score: 100}
length: 3
__proto__: Array(0)
数组变换
Map
n变n
let arr = [1,2,3,4,5,6]
arr.map(item => item * item)
=>(6),[1, 4, 9, 16, 25, 36]
filter
n变少
let arr = [1,2,3,4,5,6]
arr.filter(item => item %2 ===0?true:false)
=>(3),[2, 4, 6]
arr.filter(item => item%2 ===0)
=>(3),[2, 4, 6]
reduce
n变1
let arr =[1,2,3,4,5,6]
let sum =0
for(let i=0;i<arr.length;i++){
sum += arr[i]
}
21
arr.reduce((sum,item)=>{return sum+item},0)
21
数组的ES5方法
Array.isArray()
用来判断一个对象是不是数组
let a = []
let b = new Date()
console.log(Array.isArray(a)) //true
console.log(Array.isArray(b)) //false
.indexOf()
用来查找指定元素的位置 找不到返回-1
let arr = [3, 1, 9, 9, 'hello']
let index = arr.indexOf(9)
console.log(index) //2
let index2 = arr.lastIndexOf(9)
console.log(index2) //3
console.log(arr.indexOf(100)) //-1
.forEach()
遍历数组,参数为回调函数,回调函数里的参数为
- 遍历到的对应元素
- 元素序号
- 数组本身
let arr = [4, 2, 1, 9, 0, 5]
arr.forEach(function(val) {
console.log(val)
})
arr.forEach(function(val, index, array) {
arr[index] = val**2
})
arr.forEach(val => {
console.log( val**2 )
})
.every()
所有回调函数都返回true的时候结果才会返回true,否则 返回false
let arr = [4, -2, 1, 9, 0, 5]
let isPositive = arr.every(val => val > 0)
console.log(isPositive) //数组全是正数吗 false
.some()
只要有一个回调函数都返回true的时候结果就返回true
let arr = [4, -2, 1, 9, 0, 5]
arr.some(val => val > 0) //数组里面有正数吗 true
arr.some(val => val < 0) //数组里有负数吗 true
.filter()
过滤出满足条件的元素,构成新数组
let arr = [4, -2, -1, 9, 0, 5]
let arr1 = arr.filter(val => val > 0) //过滤出正数
console.log(arr1) // [4, 9, 5]
let arr2 = arr.filter(val => val < 0) //过滤出负数
console.log(arr2) // [-2, -1]
console.log(arr) //[4, -2, -1, 9, 0, 5] 原数组不变
.map()
遍历数组,回调函数返回值组成一个新数组返回,新数 组索引结构和原数组一致,原数组不变
let arr = [1, 4, 3, 9]
let arr1 = arr.map(v => v**2)
console.log(arr1) //[1, 16, 9, 81]
.reduce()
.reduce(function(v1, v2), initValue) 遍历数组,调用回调函数,将数组元素组合成一个值 初始值可选
let arr = [1, 4, 3, 9]
let result = arr.reduce((v1, v2) => v1 + v2)
console.log(result) //17
let result2 = arr.reduce((res, v) => res + v**2, 0)
console.log(result2)
当出现参数是个数组,最终得到一个值这种场景,考虑 使用reduce来简化代码