栈、队列方法
- pop:从栈尾弹出一个值
- push:从栈尾推入一个值
let arr = ['halo', 1, false, 0, 22, 44, 66, 88]
let val = arr.pop()
arr.push(6)
console.log(`从${arr}栈尾弹出一个${val}再推入一个6`); //打印出:从halo,1,false,0,22,44,66,6栈尾弹出一个88再推入一个6
- unshift:从队头推入一个值
- shift:从队头移出一个值
let val = arr.shift()
arr.unshift('你好')
console.log(`从${arr}栈尾弹出一个${val}再推入一个你好`); //打印出:从你好,1,false,0,22,44,66,88栈尾弹出一个halo再推入一个你好
splice,数组的增删改
- 参数:1.开始索引;2.删除元素的个数;3.插入的新元素,可以写多个
let arr = ['halo', 1, false, 0, 22, 44, 66, 88]
arr.splice(1, 2, 'stephen', 'gorge') //在第一个数组下标,删除两个值,插入'stephen'和'gorge'两个字符串
console.log(arr); //最终打印Array(8) [ "halo", "stephen", "gorge", 0, 22, 44, 66, 88 ]
- 返回一个由增删元素组成的新数组
concat、join 数组拼接
- concat 数组拼接
let arr = [1, 2, 3, 4, 99]
arr2 = arr.concat(3) //把数字3和数组arr拼接到一块
arr3 = arr2.concat([11, 22, 33, 'stephen']) //把新数组和arr2拼接到一块
console.log(`既能把数字拼接到数组${arr2};也能把数组拼接到数组${arr3};需要创建新数组,原数组不变${arr}`)
- join 把数组拼接成字符串
let arr = ['gorge', 2, 3, 4] //声明数组
let arr1 = arr.join('_') //数组拼接成字符串,每个值之间用_连接
let str = 'gorge' ////声明字符串
console.log(arr1); //打印出gorge_2_3_4
console.log(str.split('').reverse().join('')); //字符串转换为数组,再反转,再转换为字符串,打印出egrog
sort数组排序、reverse数组反转
let arr = [1, 2, 3, 4, 5]
arr.reverse() //反转
console.log(arr); //输出 54321
reverse 会修改原数组
- sort 数组排序
- 默认将元素转化成字符串进行排序
let arr1 = [12, 81, 2, 57]
arr1.sort()
console.log(arr1); //打印出[ 12, 2, 57, 81 ]
- 直接调用sort,会把数组 按照数组转换成字符串后的形式进行转换,字符串比较是 按位比较
如:'ac' > 'ca' false,因为字符串只比较第一位,而 a 的unicode码在 c 的前面,因此a<c
因此,用sort()比较22和132的时候,只会对第一位进行比较,因为2>1,因此会将22放在132后面
- 一般需要传递排序函数
let arr1 = [12, 81, 2, 57]
arr1.sort((v1, v2) => v1 > v2 ? 1:-1) //传递一个箭头函数,函数里有两个形参,会使用快速排序对数组进行排序,进行交换
console.log(arr1); //会打印出正确的排列
上面代码的形式是固定的,如果想从大到小排序,可以把>换成<,或者把 1 和 -1 的位置调换
更复杂的用法
let arr = [
{name:'gorge', score:89},
{name:'stephen', score:98},
{name:'leo', score:60}
]
arr.sort((num1, num2) => num1.score > num2.score ? 1:-1)
console.log(arr); //按照score排序,打印出按score从小到大排序的对象
forEach、.map
arr.forEach(callback) 数组的每一项都交给callback函数操作,callback的参数为
- 遍历到的对于元素
- 元素序号
- 数组本身
let arr = [1, 3, 5, 7, 9]
arr.forEach(function(val, i, array){ //三个参数分别是,遍历到的元素、数组下标(从0开始)、数组,可另外命名
array[i] = val ** 2 //把数组元素的平方给对应数组下标
})
console.log(arr); //打印出[ 1, 9, 25, 49, 81 ],原数组会改变
- arr.map(callback) 数组的每一项都交给callback函数操作,callback返回值组成新数组。原数组不变,callback的参数跟forEach一样
.filter、.reduce
- arr.filter(callback) 过滤出符合条件的元素,构成新数组,原数组不变
let arr = [
{name:'gorge', score:70},
{name:'leo', score:88},
{name:'stephen',score:59}
]
let arr1 = arr.filter(obj=> obj.score>60) //过滤出score值大于60的元素赋值给arr1
filter() 为数组中的每个元素调用一次 callbackFn 函数,并利用所有使得 callbackFn 返回 true 或
的元素创建一个新数组。
- reduce(function(temp, v), initValue)
遍历数组,调用回调函数,将数组元素组合成一个值
初始值可设置
let arr = [
{name:'gorge', score:70},
{name:'leo', score:88},
{name:'stephen',score:59}
]
let arr2 = ['g', 'o', 'r', 'g', 'e']
let sum = arr.reduce((sum, v) => sum + v.score, 0)
let str = arr2.reduce((sum, v) => sum+v , '')
上面代码中,sum是上一次调用函数时的返回值,初次调用时是设置的初始值,v为从数组下标0开始的每一个数组元素,sum+v为执行函数,最后一个值为初始值
.every、.some
- .every(callback)
所有回调函数都返回true的时候结果才返回true,否则返回false
let arr = [0, 1, 5, 8, -3]
console.log(arr.every(val => val>-5)); //打印true
- .some(callback)
用法同上,其中一个返回true则输出true
类数组对象、数组转换、空数组等
- Array.isArray(element) 判断是否为数组
let arr = [0, 1, 5, 8, -3]
console.log(Array.isArray(arr)) //是,打印true
- arr.indexOf(val) 获取val在数组中的下标,找不到返回 -1,如果数组里有几个一样的val,则返回最前面val的下标
let arr = [1, 1, 5, 8, -3]
console.log(arr.indexOf(1)) //打印出0
- arr.inlcudes(val) 判断val是否在数组中,返回true/false
let arr = [1, 1, 5, 8, -3]
console.log(arr.includes(-5)) //-5不在数组arr中,输出false
- Array(len) 创建出长度为len的空数组,空数组里面没有属性,只有长度,undefined也没有
- arr.fill(val) 把arr全部填充为val
var arr1 = [0, 2, 4, 6]
console.log(arr1.fill(1)) //不管原数组里面有什么,把数组元素全部填充为1
- Array.from(arrayLike) 把一个伪数组对象(拥有length属性和若干索引属性的任意对象)或可迭代对象(可以获取数组中的元素,如字符串)转化为数组,原数组并不会被改变
let ojb = {0:1, 1:4, 2:1, 4:1, 6:'hh', length:7} //这是一个伪数组对象,它拥有length属性和数组下标索引
console.log(Array.from(ojb)) //转化为数组,打印出[ 1, 4, 1, undefined, 1, undefined, "hh" ]
console.log(Array.from('gorge')) //把字符串转化为数组,打印出[ "g", "o", "r", "g", "e" ]
- [...obj] 把可迭代对象转化为数组
console.log([...'gorge']) //把字符串gorge转化为数组,打印出[ "g", "o", "r", "g", "e" ]