前言
该文章记录一些数组基本知识,慢慢将会添加到一些数组高级知识,所有内容均从网上整理而来,加上自己得理解做一个整合,方便工作中使用。
一. 数组
- 数组(Array)
- 数组是一种复合型数据类型,在数组中可以存储不同类型的数据
- 数组中存储的数据是有序的,每个数据都有唯一的索引,通过索引操作对应数据,索引从0开始;也可以是变量,动态替换
- 数组中存储的数据也称元素
- 创建数组
- 通过new Array()
- 通过数组字面量
//通过new Array() let students = new Array() //通过字面量[] let teachers = [] - 添加元素
- 语法: 数组[索引] = 元素
- 非连续性数组
let arr = [] arr[0] = 0 arr[1] = 1 arr[99] = 99 console.log(arr) //输出: (100) [0, 1, empty × 97, 99] //数组会按索引存储,没有赋值都会存空,浪费内存 - 读取元素
- 数组[索引]
- 如果读取数组不存在的元素,不会报错,返回undefined
- 数组属性
- length : 数组存储的元素个数
//length是可以修改的 let arr = [1,2,3,4] console.log(arr.length) //输出:4 arr.length=2 //修改length,比原来小,则剪切数组 console.log(arr) //输出:(2) [1, 2] arr.length=10 //修改length,比原来大,则填充空值增长数组 console.log(arr) //输出:[1, 2, empty × 8]
二. 数组的方法
1. 静态方法
- Array.isArray(变量) //判断变量是否是数组,返回true/false
- Array.from(arrayLike , [mapFn] , [thisArg]) //将
伪数组/可迭代对象转化为真正的数组- arrayLike:想要转换成数组的伪数组对象或可迭代对象。
- mapFn:可选,如果指定了该参数,
新数组中的每个元素会执行该回调函数 - thisArg:可选参数,执行回调函数
mapFn时this对象。
//字符串被拆分成数组 let result = Array.from('abc') console.log(result)//输出:['a', 'b', 'c'] //数组会生成一个新数组 let arr = [1, 2, 3] let result1 = Array.from(arr) console.log(result1)//输出:[1, 2, 3] console.log(result1 === arr)//输出:false let result2 = Array.from(arr, item => item * 2) console.log(result2) //[2, 4, 6] //Map类型转成数组 let map = new Map([['name', '胡歌'], ['sex', '男']]) let result3 = Array.from(map.values()) console.log(result3) // ['胡歌', '男'] //Set类型转化数组 const set = new Set(['foo', 'bar', 'baz']); let result4 = Array.from(set); console.log(result4) // ['foo', 'bar', 'baz']
2. 实例对象的方法
let arr = [ ]
2-1. arr.at(i)
- i 是索引,传入索引获取对应的元素,i 可以是负数
const array = [5, 12, 8, 130, 44];
console.log(array.at(2)) //输出 8
console.log(array.at(-1)) //输出 44
2-2. arr.concat( 数组1,数组2,数组3,··· )
- 将arr数组和添加的数组合并成一个数组,
不改变原数组
let arr = [1, 2, 3, 4]
let arr2 = [7, 8]
let newarr = arr.concat(arr2)
console.log(newarr) //输出 [1, 2, 3, 4, 7, 8] ,将arr2内容拼接在arr后面,返回一个新数组
let newarr2 = arr.concat(arr)
console.log(newarr2) //输出[1, 2, 3, 4, 1, 2, 3, 4] ,可以将同一个数组重复一边
//es6 简写方法
let newarr3 = [...arr, ...arr2]
2-3. arr.findIndex((element)=>{···})
- 获取元素在该数组中第一次出现的索引,没有则返回-1
- 参数:search-要查询的内容 formIndex-查询的起始位置
let arr = ['胡歌', '霍建华', '胡歌']
let res = arr.findIndex(item=> item=='胡歌')
console.log(res) //输出 0 ,即元素第一次出现的索引
let res = arr.findIndex(item=>item=='李白')
console.log(res) //输出 -1 ,没有找到相同元素返回-1
2-4. arr.jion(separator)
- 将数组中所有元素拼接成字符串,
不改变原数组 - 参数:separator-每个元素之间添加该内容,默认是","
let arr = ['胡歌', '霍建华', '胡歌']
let res = arr.join(',')
console.log(res) //输出:胡歌,霍建华,胡歌
let res = arr.join('')
console.log(res) //输出:胡歌霍建华胡歌
let res = arr.join('-')
console.log(res) //输出:胡歌-霍建华-胡歌
//arr.toString() 也是将数组转换为字符串
2-5. arr.slice(start,end)
- 截取数组中某部分,
不改变原数组 - 参数:start-截取开始位置(包含) end-截取结束位置(不包含)
let arr = ['a', 'b', 'c', 'd', 'e', 'f']
let res = arr.slice(0, 3)//从索引0开始,截取到索引3,不包括索引3
console.log(res) //输出:['a', 'b', 'c']
let res = arr.slice(2) //从索引2开始截取,没有end就是截取剩下全部
console.log(res) //输出:['c', 'd', 'e', 'f']
let res = arr.slice() //不传参就是浅拷贝一份原数组
console.log(res) //输出:['a', 'b', 'c', 'd', 'e', 'f']
let res = arr.slice(-3,-1) //从倒数第三开始截取,倒数第一结束,不包括倒数第一
console.log(res) //输出:['d', 'e']
2-6. 数组增/删,改变原数组
- arr.push(value,value2,···) //向原数组末尾添加元素,返回数组新的长度
- arr.unshift(value,value2,···) //向原数组开头添加元素,返回数组新的长度
- arr.pop() //删除原数组最后一个元素,返回被删除元素
- arr.shift() //删除原数组第一个元素,返回被删除元素
- arr.splice( start,deletCount,item1,item2,··· )
- 可以删除、添加、插入、替换
- 参数:
- start-修改开始位置
- deletCount-删除个数,可选值,如果不填,默认删除开始位置后面所有
- item-要插入的值,可以值
let arr = ['a', 'b', 'c', 'd']
arr.push('e', 'f')
console.log(arr) // ['a', 'b', 'c', 'd', 'e', 'f']
arr.unshift('huge')
console.log(arr) // ['huge', 'a', 'b', 'c', 'd', 'e', 'f']
arr.pop()
console.log(arr) // ['huge', 'a', 'b', 'c', 'd', 'e']
arr.shift()
console.log(arr) // ['a', 'b', 'c', 'd', 'e']
--------------
let myFish = ["angel", "clown", "mandarin", "sturgeon"];
//从索引2的位置开始删除所有元素
var removed = myFish.splice(2);
// 运算后的 myFish: ["angel", "clown"]
// 被删除的元素:["mandarin", "sturgeon"]
//[从索引 2 的位置开始删除 0 个元素,插入“drum”]
let removed = myFish.splice(2, 0, "drum");
// 运算后的 myFish: ["angel", "clown", "drum", "mandarin", "sturgeon"]
// 被删除的元素:[], 没有元素被删除
2-7. arr.reverse(),反转数组,改变原数组
- arr.reverse() //改变数组顺序,颠倒数组
let arr = ['a', 'b', 'c', 'd']
arr.reverse()
console.log(arr) //['d', 'c', 'b', 'a']
2-8. arr.sort(),数组排序,改变原数组
- arr.sort(compareFn) //传入函数,根据要求排序
//不传参时,不适应数字排序,会按照unicode编码排序,适用字符串
let arr = ["a","c","b"]
arr.sort()
console.log(arr) // ["a","b","c"]
//顺序
let arr = [1, 4, 3, 3, 7, 3, 4, 1, 3]
arr.sort((a, b) => a - b)
console.log(arr) // [1, 1, 3, 3, 3, 3, 4, 4, 7]
//倒序
let arr = [1, 4, 3, 3, 7, 3, 4, 1, 3]
arr.sort((a, b) => b - a)
console.log(arr) // [7, 4, 4, 3, 3, 3, 3, 1, 1]
2-9. arr.forEach() 遍历数组
- arr.forEach((element,index,arr)=>{})
- 需要回调函数作为参数,数组元素有多少,回调函数执行多少次
- 回调函数参数
- element 当前遍历的元素
- index 当前遍历元素的索引
- arr 被遍历的数组(这个参数极少用)
let names=["胡歌","李白","李商隐"] names.forEach((item,i)=>{ console.log(item) }) //依次输出:胡歌 李白 李商隐
2-10. arr.filter() 过滤数组
- arr.filter((element,index,arr)=>{})
- 遍历数组,每个元素都执行一次回调函数,根据返回值判断是否将该元素添加到新数组中
- 不改变原数组,返回一个满足条件的新数组
- 回调函数参数
- element 当前遍历的元素
- index 当前遍历元素的索引
- arr 被遍历的数组(这个参数极少用)
- 回调函数必须要return true/false;true表示满足条件返回到新数组,false不满足条件
let names=["胡歌","李白","李商隐"] let newarr = names.filter((item,i)=>{ return item.length>2 }) console.log(newarr) //输出 ["李商隐"]
2-11. arr.map() 根据原数组返回一个新数组
- arr.map((element,index,arr)=>{})
- 遍历数组,每个元素都执行一次回调函数,return一个结果添加到新数组中
- 不改变原数组,返回一个新数组
- 回调函数参数
- element 当前遍历的元素
- index 当前遍历元素的索引
- arr 被遍历的数组(这个参数极少用)
- 回调函数必须要return 结果,该结果就是新数组的元素
let names=[1,2,3,4,5] let newarr = names.map(item=>{ return item*10 }) console.log(newarr) //输出 [10, 20, 30, 40, 50]
2-12. arr.reduce() 整合所有元素为一个值
- arr.reduce((previousValue,currentValue,currentIndex)=>{},initialValue)
- 遍历数组,每个元素都执行一次回调函数,return一个结果添加到新数组中
- 不改变原数组,返回一个新数组
- 回调函数参数
- previousValue 上一次遍历的元素
- currentValue 当前遍历的元素
- currentIndex 当前遍历的元素的索引
- initialValue 作为第一次执行回调函数时previousValue的值,如果没有设置,则第一次执行回调函数时previousValue取第一个元素的值,currentValue取第二个元素的值
- 回调函数必须要return 结果,否则就是undefined
let names=[1,2,3,4,5] //没有设置initialValue,则是每个元素相加 let val = names.reduce((pre,cur)=>{ return pre+cur }) console.log(val) //输出 15 //设置initialValue = 5,则5+数组中的元素 let val2 = names.reduce((pre,cur)=>{ return pre+cur },5) console.log(val) //输出 20
2-13. arr.every() 判断所有元素是否通过回调函数,返回布尔值
- arr.every((element,index)=>{ })
- 遍历数组,判断每个元素是否满足回调函数,不满足停止遍历,返回false;都满足返回true
- 回调函数必须 return
let arr = [2, 34, 56, 13, 6]
//判断数组所有元素是否大于10
let res = arr.every((element, index) => {
return element > 10
})
console.log(res) //返回false
2-14. arr.some() 判断是否有一个元素通过回调函数,返回布尔值
- arr.some((element,index)=>{ })
- 遍历数组,判断是否有一个元素满足回调函数,有元素满足就立即停止遍历,返回true;都不满足返回false
- 回调函数必须 return
let arr = [2, 34, 56, 13, 6]
//判断数组是否有元素大于10
let res = arr.some((element, index) => {
return element > 10
})
console.log(res) //返回true
2-15. arr.find() 找到第一个满足条件的元素
- arr.find((element,index)=>{ })
- 遍历数组,找到第一个满足条件的元素,有元素满足就立即停止遍历,返回该元素;都没找到返回undefined
- 回调函数必须 return,返回的就是满足条件的第一个元素
let arr = [2, 34, 56, 13, 6]
//判断数组是否有元素大于10
let res = arr.find((element, index) => {
return element > 10
})
console.log(res) //返回34
2-15. arr.flat() 扁平化数组
- arr.flat(depth)
- depth 可选项,默认值是1,指定要扁平化几层嵌套数组
- 返回一个包含数组与子数组中所有元素的新数组
//扁平化一级子数组
let arr = [2, 34, [6, 1], [[11, 22], 2], 6]
let res = arr.flat()
console.log(res) //输出 [2, 34, 6, 1, Array(2), 2, 6] ,一级数组被展开了,二级数组只展开了一级
//扁平化到二级子数组
let res2 = arr.flat(2)
console.log(res2) // 输出 [2, 34, 6, 1, 11, 22, 2, 6]