一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
数组迭代器方法
迭代器方法用于遍历数组元素,通常会对每个元素调用一次我们指定的函数。
forEach方法
forEach()方法迭代数组的每个元素,并对每个元素都调用一次我们指定的函数。这个指定的函数可以接收3个参数:数组元素的值、数组元素的索引和数组本身。
let data = [1,2,3,4,5], sum = 0;
//计算数组元素之和
data.forEach(val => sum + val);//sum == 15
//递增每个元素的值
data.forEach(function(v, i, a){a[i] = v + 1}) // data==[2,3,4,5,6]
map方法
map()方法把调用它的数组的每个元素分别传给我们指定的函数,返回这个函数的返回值构成的数组。注意:传给map()方法的函数应该有返回值。map()方法返回一个新数组,不会修改原数组。
let a = [1,2,3,4]
let b = a.map(x=>x*x) // a==[1,2,3,4]; b==[1,4,9,16]
filter方法
filter()方法返回一个数组,该数组包含调用它的数组的子数组。传给filter()方法的函数应该是一个返回true或false的函数。如果函数返回true,则传给这个函数的元素就是filter最终返回的子数组的成员。
let a = [5,4,3,2,1]
let b = a.filter(x => x%2==0) //b==[4,2];a=[5,4,3,2,1]
find和findIndex方法
find和findIndex方法,寻找断言函数返回真值的元素。在断言函数找到第一个元素时停止迭代。find返回匹配的元素,findIndex返回匹配元素的索引。如果没有找到元素,find返回undefined,findIndex返回-1
let a = [1,2,3,4,5]
a.findIndex(x => x===3) //=>2
a.findIndex(x => x<0) // =>-1
a.find(x => x%5 === 0) //=>5
a.find(x=>x%7===0) // =>undefined
every和some方法
every()和some()方法是数组断言方法,他们会对数组元素调用我们传入的断言函数,最后返回true或false。 every()方法只在断言函数对数组的所有元素都返回true时才返回true。some()方法只要断言函数返回true,它就返回true
let a = [1,2,3,4,5];
a.every(x => x<10) //=>true
a.every(x=> x%2===0) //=> false
a.some(x=> x%2 ===0) //=>true
a.some(isNaN)//=>false
注意:在空数组上调用他们,every()会返回true,some()会放回false
reduce和reduceRight方法
reduce接收两个参数,第一个参数是执行归并操作的函数。这个归并函数的任务就是把两个值组合为一个值并返回这个值,第二个参数是可选的,是传递给归并函数的初始值。如果第二个参数不传,那么数组的第一个和第二个元素,作为其第一和第二个参数。在reduce中使用的函数与在forEach,map中使用的函数不同。值、索引、数组本身作为第二个、第三个和第四个参数。
let a = [1,2,3,4,5]
a.reduce((x, y) => x+y, 0)
a.reduce((x, y) => x*y, 1)
a.reduce((x, y) => x > y ? x : y)//找出最大值
reduceRight和reduce方法类似,只不过是从高索引向低索引处理数据。如果归并操作有右结合性,那么考虑使用reduceRight
求2^(3^4)
let a = [2,3,4]
a.reduceRight((acc, val) => Math.pow(val, acc))
使用flat()和flatMap()打平数组
flat()方法用于创建并返回一个新数组,这个新数组包含与它调用flat()的数组相同的元素,只不过其中任何数组的元素会被打平田中到返回的数组中。
[1,2,[3,4]].flat()//=>[1,2,3,4]
[1,2,[3,[4]]].flat()//=>[1,2,3,[4]]
[1,2,[3,[4]]].flat(2)//=>[1,2,3,4]
flatMap与map方法类似,只不过返回的数组会被自动打平。调用a.flatMap(f)等同于(但效率远高于)a.map(f).flat()
let phrase = ['hello word', 'the definitive guide']
let words = phrase.flatMap(phrase => phrase.split(" "))
使用concat()添加数组
concat()方法创建并返回一个新数组,新数组包含调用concat()方法的数组的元素,以及传给concat的参数。如果这些参数中有数组,则拼接的是这些数组的元素而非数组本身。concat不会地柜打平数组,不修改调用它的数组。
let a = [1,2,3]
a.concat(4,5)//=>[1,2,3,4,5]
a.concat([4,5],[7,8]) //=>[1,2,3,4,5,7,8]
a.concat(4,5,[6,[7,8]]) //=>[1,2,3,4,5,6,[7,8]]
a//=>[1,2,3]
通过push()、pop()、shift()和unshift()实现栈和队列操作
- push()方法用于在数组的末尾添加一个或多个新元素,并返回数组长度。
- pop()方法用于删除数组最后面的元素,减少数组长度,并返回删除的元素。
- push和pop可以使用数组实现先进后出的栈。
- unshift()方法用于在数组开头添加一个或多个元素。并返回数组的新长度
- shift()方法用于在数组的开头删除一个元素。返回删除的元素。
- 使用shift和push方法可以实现队列。
let stack = []
stack.push(2)//stack == [2]
stack.push(3)//stack == [2,3]
stack.pop()//stack == [2]
let q = []
q.push(1,2)//q==[1,2]
q.shift()//q==[2]
q.push(3)//q==[2,3]
q.shift()//q==[3]
q.shift()//q==[]
let a =[]
a.unshift(2,3,4) //a==[2,3,4]
a.unshift(5)//a==[5,2,3,4]
使用slice() splice() fill() copyWithin()提取、替换、填充、复制切片的方法。
slice()
slice()方法返回一个数组切片或者子数组。这个方法接收两个参数,分别用于指定要返回切片的起止位置。 返回的数组包含第一个参数指定的元素,以及所有后续元素,直到但不包含第二个元素所指的元素。 如果只指定一个参数,则这个值相对于数组长度指定数组元素。如果参数是负值,则这个值相对于数组长度指定数组元素。-1指定数组的最后一个元素,-2指定倒数第二个元素。
let a = [1,2,3,4,5]
a.slice(0,3)//[1,2,3]
a.slice(3)//[4,5]
a.slice(1, -1)//[2,3,4]
a.slice(-3, -1)//[3,4]
splice()
splice()方法是一个对数组进行插入和删除的通用方法。与slice()和concat()不同的是,splice()会修改数组。
splice()第一个参数指定插入或删除操作的起点位置。第二个参数指定要从数组中删除元素的个数,这两个参数后面可以跟任意多参数,表示要在第一个参数指定的位置插入到数组中的元素。
splice()返回被删除元素的数组。如果没有删除元素,返回空数组。
a = [1,2,3,4,5,6,7,8]
a.splice(4)//返回[5,6,7,8];a==[1,2,3,4]
a.splice(1,2)//返回[2,3];a==[1,4]
a.splice(1,1)//返回[4]; a==[1]
a.splice(1,0,2,3,4,5)//a==[1,2,3,4,5]
fill()
fill()方法将数组的元素或切片设置为指定的值,会修改调用它的数组。
fill()方法第一个参数是填充数组的值。第二个参数指定起始索引,第三个参数指定终止索引,到这个索引为止,但不包含的数组元素会被填充。
let a = new Array(5)
a.fill(0)//[0,0,0,0,0]
a.fill(9, 1)//[0,9,9,9,9]
a.fill(8,2,-1)//[0,9,8,8,9]
copyWithin()
copyWithin()方法把数组切片复制到数组中的新位置。
第一个参数指定切片复制到哪个位置。第二个参数和第三个参数指定切片的起止位置,如果省略第二个参数,默认值为0,如果省略第三个参数,默认值为数组长度。
let a = [1,2,3,4,5]
a.copyWithin(1) // a == [1,1,2,3,4]
a.copyWithin(2,3,5) // a==[1,1,3,4,4]
a.copyWithin(0, -2) // a==[4,4,3,4,4]
数组索引与排序方法
indexOf()和lastIndexOf()
从数组中搜索指定的值并返回第一个找到的元素的索引。如果没找到返回-1。。indexOf是从左向右搜索数组。lastIndexOf是从右向左搜索数组。
indexOf和lastIndexOf使用===操作符比较他们的参数和数组元素。如果数组包含对象而非原始值,这些方法检查两个引用是否引用同一个对象。如果想查找对象的内容,可以使用find()方法,并传入自定义的断言函数。
indexOf和lastIndexOf都接收第二个参数,指定从那个位置开始搜索。如果省略这个参数,indexOf会从头开始搜索,lastIndexOf会从末尾开始搜索。
let a = [0,1,2,1,0]
a.indexOf(1)//=>1
a.lastIndexOf(1)//=>3
a.indexOf(3)//=>-1
includes()
includes()方法接收一个参数,如果数组包含该值则返回true,否则返回false。includes认为NaN与自身相等,indexOf无法检测到数组中的NaN值。但includes可以。
let a = [1,true,3,NaN]
a.includes(true) //=>true
a.includes(2)//=>false
a.includes(NaN)//=>true
a.indexOf(NaN)//=>-1
sort()
sort()对数组元素就地排序并返回排序后的数组。在不传参数是,sort按照字母顺序对数组元素排序。如果飞字母顺序排序,必须给sort传一个比较函数作为参数。这个函数决定他的两个参数那个排在前面。如果第一个参数应该出现在第二个参数前面,比较函数应该返回一个小于0的数值。如果第一个参数应该出现在第二个参数后面,比较函数应该返回一个大于0个数值。
let a = [33,4,111,222]
a.sort((a,b)=> a-b)//a == [4,33,111,222]
a.sort((a, b) => b - a)//a==[222,111,33,4]
reverse()
reverse方法反转数组元素顺序。
let a = [1,2,3,4,5]
a.reverse()//a==[5,4,3,2,1]
数组转换成字符串的方法
- JSON.stringify() 对数组进行序列号
- join()方法把数组的所有元素转换为字符串,然后拼接起来并返回结果字符串
- toString()方法,和没有参数的join()方法一样
- toLocaleString()方法
数组的静态方法
- Array.of()创建数组的工厂方法
Array.of() //=> []
Array.of(1) // =>[1]
Array.of(1,2,3)//=>[1,2,3]
- Array.from()创建数组的工厂方法,参数是一个可迭代对象或者类数组对象
Array.from(original)
Array.from(arraylike)
- Array.isArray()确定一个未知值是否为数组。
Array.isArray([])//=>true
Array.isArray({})//=>false