数组方法
//测试数组
const PAGE = [
{ name: '猪爸', age: 24 },
{ name: '猪妈', age: 23 },
{ name: '佩奇', age: 8 },
{ name: '乔治', age: 5 },
{ name: '小羊苏西', age: 7 }
]
1. join
作用:用指定的分隔符将数组每一个元素拼接为字符串
参数: 指定的分隔符(如果省略该参数,则默认是逗号隔开)
返回值:拼接好的字符串
会改变原数组
// 数组的 join 方法
let arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
// 以传的参数为连接符, 返回的是一个 " 字符串 ", 如果不传那么就是以 " , " 连接
let bar = arr.join()
console.log(arr); // ['a', 'b', 'c', 'd', 'e', 'f', 'g']
console.log(bar); // a*b*c*d*e*f*g
2. pop()
作用:删除数组的最后一个元素
参数:无
返回值:被删除的元素
会改变原数组
// 数组的 pop 方法; 改变原数组
let arr = [1, 2, '小白', 3]
// 删除数组的最后一个 返回的是删除的那一个值, 并且直接改变原数组
let bar = arr.pop()
console.log(arr); // [1, 2, '小白']
console.log(bar); // 3
3. push()
作用:向数组的末尾添加新内容
参数 可以添加多个元素 用逗号隔开 任何数据类型都可以
返回值 新增后数组的长度(这个很重要)
会改变原数组
4. shift()
作用:删除数组的第一个元素
参数:无
返回值:被删除的元素
会改变原数组
// 数组的 shift 方法; 改变原数组
let arr = [1, 2, '小白', 3]
// 删除数组的第 1 个数据, 返回值是被删除的数据
let bar = arr.shift()
console.log(arr); // [2, '小白', 3]
console.log(bar); // 1
5. unshift()
作用:向数组首位添加新内容
参数:要添加的元素, 添加多个元素用逗号隔开
返回值:新数组的长度
会改变原数组
// 数组的 unshift 方法; 改变原数组
let arr = [1, 2, '小白', 3]
// 向数组的最前面添加数据, 改变原数组, 返回的是数组的 length 长度
let bar = arr.unshift('小顾')
console.log(arr); // ['小顾', 1, 2, '小白', 3]
console.log(bar); // 5
6. slice()
作用:按照条件查找出其中的部分内容
参数: arr.slice(n,m)从索引n开始查找到m处(不包括m)
arr.slice(n)第二个参数省略,则一直查找到末尾
arr.slice(0)原样输出内容,可以实现数组克隆
arr.slice(-n,-m)slice支持负参数,从最后一个元素开始算起,-1为最后
一个元素,-2为倒数第二个元素
返回值:返回一个新数组
不改变原数组
// // 数组的 slice 方法
let arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
// // 按数组的下标截取 (起始下标开始, 结束的下标) 下标是包前不包后
let bar = arr.slice(1, 3)
console.log(arr); // ['a', 'b', 'c', 'd', 'e', 'f', 'g']
console.log(bar); // ['b', 'c']
// 只传一个参数那么就是从下标开始一直截取到最后
let bar = arr.slice(1)
console.log(bar); // ['b', 'c', 'd', 'e', 'f', 'g']
7. splice()
作用:对数组进行增删改
增加:arr.splice(n,0,m)从索引n开始删除0项,把m或者更多的内容插入到索引n的前面
返回空数组
修改:arr.splice(n,x,m)从索引n开始删除x个,m替换删除的部分
把原有内容删除掉,然后用新内容替换掉
删除:arr.splice(n,m)从索引n开始删除m个内容
(如果第二个参数省略,则从删除到末尾)就是从n开始之后的元素都删除
返回删除的新数组,原有数组会改变
// 数组的 splice 方法; 改变原数组
let arr = [1, 2, '小白', 3]
// 传两个参数: (开始的下标, 截取几个) 返回的是截取的数据按照数组的形式返回
let bar = arr.splice(2, 2)
console.log(arr); // [1, 2, 3]
console.log(bar); // ['小白']
// 传一个参数: (只传一个) 数组的下标开始截取到最后
let foo = arr.splice(1)
console.log(arr); // [1]
console.log(foo); // [2, '小白', 3]
// 传多个参数: (下标, 截取几个, 替换的数据) 截取的个数是 0 那么就相当于直接插值进去
let num = arr.splice(1, 0, '你好', '小顾')
console.log(arr); // [1, '你好', '小顾', 2, '小白', 3]
console.log(num); // []
8. concat()
作用:用于连接两个或多个数组
参数:参数可以是具体的值,也可以是数组对象。可以是任意多个
返回值:返回连接后的新数组
不改变原数组
基本操作
// 4. 数组的 concat 方法; 不改变原数组
let arr = [1, 2, '小白', 3]
// 拼接数组的方法, 返回的是拼接后的数组
let bar = arr.concat([10, 11], ['校花', '校草'])
console.log(arr); // [1, 2, '小白', 3]
console.log(bar); // [1, 2, '小白', 3, 10, 11, '校花', '校草']
结合reduce 实现拍平数组
const arr = [1, 2, 3, [1, 2, 3, 4, [2,[1,[8,[9]]], 3, 4]]]
function e(arr1) {
return arr1.reduce((sum, item) => {
return sum.concat(Array.isArray(item) ? e(item) : item)
}, [])
}
console.log(e(arr))
9. indexOf()
作用:检测当前值在数组中第一次出现的位置索引
参数:arr.indexOf(item,start)item:查找的元素 start:字符串中开始检索
的位
返回值:第一次查到的索引,未找到返回-1
不改变数组
10. lastlndexOf()
作用:检测当前值在数组中最后一次出现的位置索引
参数:array.lastIndexOf(item,start) item:查找的元素 start:字符串中开始
检索的位置
返回值:第一次查到的索引,未找到返回-1
不改变原数组
11. includes()
作用:判断一个数组是否包含一个指定的值
参数:指定的内容
返回值:布尔类型
不改变原数组
12. sort()
作用:对数组的元素进行排序(默认是从小到大来排序 并且是根据字符串来排序的)
参数:可选(函数) 规定排序规则 默认排序顺序为按字母升序
返回值:排序后新数组
改变原数组
sort在不传递参数情况下,只能处理10以内(个位数)数字排序
// 数组的 sort 方法; 改变原数组
let arr = [1, 3, 7, 9, 101, 5, 15]
// 第一个参数不会变, 不传参只能处理 10 以内的数据排序, 从小到大
let bar = arr.sort()
console.log(arr); // [1, 101, 15, 3, 5, 7, 9]
console.log(bar); // [1, 101, 15, 3, 5, 7, 9]
// 从小到大排序
let bar = arr.sort((a, b) => {
return a - b
})
console.log(arr); // [1, 3, 5, 7, 9, 15, 101]
console.log(bar); // [1, 3, 5, 7, 9, 15, 101]
// 从小到大排序
let bar = arr.sort((a, b) => {
return b - a
})
//不管 返回 还是 原数组 都是会改变的
console.log(arr);//[101, 15, 9, 7, 5, 3, 1]
console.log(bar);//[101, 15, 9, 7, 5, 3, 1]
13. map()
作用:按照某种映射关系,把数组的每一个元素给修改了
回调函数执行次数 == 数组长度
返回值:返回映射之后的新数组 如果没有return, 则map的返回值都是undefined
经典场景:数据驱动渲染dom树(将数组直接渲染到页面)
Array.prototype.PAGE_map = function (callback) {
const res = []
for (let i = 0; i < this.length; i++) {
res.push(callback(this[i], i, this))
}
return res
}
console.log(PAGE.PAGE_map((item, index) => `${item.name}--${item.num}--${index}`))
// [ '猪爸--24--0', '猪妈--23--1', '佩奇--8--2', '乔治--5--3', '小羊苏西--7--4' ]
14. filter()
作用:筛选数组
回调函数执行次数 == 数组长度
return true : 符合筛选条件,当前元素放入新数组中
return false : 不符合筛选条件,当前元素不放入新数组中
返回值:返回筛选之后的新数组
应用场景: 筛选数组,将符合条件的元素放入新数组中
Array.prototype.PAGE_filter = function (callback) {
const res = []
for (let i = 0; i < this.length; i++) {
callback(this[i], i, this) && res.push(this[i])
}
return res
}
console.log(PAGE.PAGE_filter(item => item.num >= 10))
// [
// { name: '猪爸', age: 24 },
// { name: '猪妈', age: 23 },
//
// ]
15. some()
作用:判断数组中是否有符合条件的元素 (逻辑或 ||)
回调函数执行次数 != 数组长度
return true : 循环结束。 找到了满足条件的元素
return false : 循环继续。 没找到,循环继续。 如果所有元素全部遍历还是没找
到,最终结果就是false
返回值: true : 有符合条件的元素
false : 没有符合条件的元素
Array.prototype.PAGE_some = function (callback) {
let flag = false
for (let i = 0; i < this.length; i++) {
flag = callback(this[i], i, this)
if (flag) break
}
return flag
}
console.log(PAGE.PAGE_some(item => item.num >= 23)) // true
console.log(PAGE.PAGE_some(item => item.num >= 50)) // false
16. forEach()
参数
item :遍历项
index : 遍历项索引
arr:数组本身 作用:遍历数组
类似于for循环遍历数组
回调函数执行次数 == 数组长度
没有返回值
Array.prototype.PAGE_forEach = function (callback) {
for (let i = 0; i < this.length; i++) {
callback(this[i], i, this)
}
}
PAGE.PAGE_forEach((item, index, arr) => {
console.log(item, index)
})
{ name: '猪爸', age: 24 },//0
{ name: '猪妈', age: 23 },//1
{ name: '佩奇', age: 8 },//2
{ name: '乔治', age: 5 },//3
{ name: '小羊苏西', age: 7 }//4
17. every()
作用:判断数组中 是否所有的 元素都满足条件 (逻辑与&&)
回调函数执行次数 != 数组长度
return true : 循环继续。当前元素满足条件,则继续判断,如果循环执行完毕
还是true,则最终的结果就是true
return false : 循环结束。 只要找到不满足条件的元素,循环立即结束。最终every
的返回值是false
返回值:true : 所有的元素 都符合条件
false : 有元素 不符合条件
应用场景: 开关思想 (购物车全选框)
Array.prototype.PAGE_every = function (callback) {
let flag = true
for (let i = 0; i < this.length; i++) {
flag = callback(this[i], i, this)
if (!flag) break
}
return flag
}
console.log(PAGE.PAGE_every(item => item.num >= 23)) // false
console.log(PAGE.PAGE_every(item => item.num >= 0)) // true
18. findIndex()
作用: 查找元素的下标
回调函数执行次数 != 数组长度
return true : 循环结束。 找到了,此时返回值就是下标\
return false : 循环继续。 没找到,循环继续。 如果所有元素全部遍历还是
没找到,最终结果就是-1
返回值:元素下标 或者 -1
19. reduce()
pre第一个参数 前一项
next: 第二个参数 下一项
前两个值在回调函数里 作为参数
最后一个值,一般是0 作为起始值
作用:求数组累加和方法
对数组个元素执行一次回调函数,累加最后一次回调的结果
参数:第一个是reduce回调函数,第二个是初始值 一般为0
在回调函数中还有四个参数
1. 函数处理累加的计算结果
2.当前被执行的数组元素
3.当前被执行的数组元素下标
4.PAGE:原数组,也就是调用reduce方法的数组
reduce场景: 数组元素求和、求数组元素最大值
Array.prototype.PAGE_reduce = function (callback, initValue) {
let start = 0, pre
if (initValue) {
pre = initValue
} else {
pre = this[0]
start = 1
}
for (let i = start; i < this.length; i++) {
pre = callback(pre, this[i], i, this)
}
return pre
}
// 计算所有age相加
const age = PAGE.PAGE_reduce((pre, next) => {
return pre + next.age
}, 0)
console.log(age) // 67
20.Array.from()
伪数组转数组\
具体操作场景 数组去重 展开 运算符 和Array.from() 效果 一样
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
return Array.from(new Set(arr)) }
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
return [...new Set(arr)] }
21.find()
22. 数组的 reverse 方法;
改变原数组
使原数组反转\
//首先这个方法是写在数组的原型上的方法
var arr = [1,2,3,4,5];
Array.prototype.myReverse = function (){
for(var i=0;i<this.length/2; i++){
var temp =this[i];
this[i] = this[this.length -1-i];
this[this.length-1-i] = temp;
}
return this;
}
arr.myReverse();
// 数组的 reverse 方法;
改变原数组
let arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
// 使原数组反转
let bar = arr.reverse()
console.log(arr); // ['g', 'f', 'e', 'd', 'c', 'b', 'a']
console.log(bar); // ['g', 'f', 'e', 'd', 'c', 'b', 'a']