数组方法大全
序 看图理解
1、添加元素
1.1 .push() -- 尾部添加
使用场景: 数组尾部添加元素。
返回值: 添加完后的数组的长度。
是否改变原数组: 是
参数: 添加元素
案例:
let arr = [1,2,3,4,5]
console.log(arr.push(5)) // 6
console.log(arr) // [1,2,3,4,5,5]
1.2 .unshift() -- 头部添加
使用场景: 数组头部添加元素。
返回值: 添加完后的数组的长度。
是否改变原数组: 是
参数: 添加元素
案例:
let arr = [1,2,3,4,5]
console.log(arr.unshift(2)) // 6
console.log(arr) //[2,1,2,3,4,5]
2、删除元素
2.1 .pop() -- 尾部删除
使用场景: 数组尾部删除元素。
返回值: 删除的元素。
是否改变原数组: 是
案例:
let arr = [1,2,3,4,5]
console.log(arr.pop()) // 5
console.log(arr) //[1,2,3,4]
2.2 .shift() -- 头部删除
使用场景: 数组头部删除元素。
返回值: 删除的元素。
是否改变原数组: 是
案例:
let arr = [1,2,3,4,5]
console.log(arr.shift()) // 1
console.log(arr) // [2,3,4,5]
2.3 .splice(i,n)
功能: 删除从i(索引值)开始之后的那个元素。
使用场景: 从任意位置开始删除任意元素。
返回值: 删除的元素。
是否改变原数组: 是
参数: i
⇒ 索引值 、 n
⇒ 个数
案例:
let arr = [1,2,3,4,5]
console.log(arr.splice(2,2)) //[3,4]
console.log(arr) // [1,2,5]
3、查找元素
3.1 .indexOf(item,start)
功能: 查找某个元素在数组中的位置
相似方法: lastIndexOf()
– 查找字符串最后出现的位置
参数:
item
必填 ⇒ 查找的元素start
可选 ⇒ 规定在数组中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的首字符开始检索。
返回值: 指定的字符串值在字符串中首次出现的位置,-1代表没有找到该元素。也就说明该数组不包含此元素。
案例:
var arr = ['a','b',4,7,2,'k'];
var index = arr.indexOf('b')
var index1 = arr.indexOf(9)
var index2 = arr.indexOf('b',4)
console.log(index) // 1
console.log(index1) // -1
console.log(index2) // -1
上面的 index2 表示,从数组arr的第四个位置起查找b,虽然arr数组包含b元素,但是它的位置是在1,如果从第四个位置开始查找时就不可能存在了。
3.2 .find(callback)
功能: 用于找出第一个符合条件的数组元素。
返回值: 循该方法环遍历数组,直到找出第一个返回值为 true
的元素,然后返回该元素,否则返回 undefined
。
是否改变原数组: 否
案例:
var arr = [1, 5, 10, 15];
var arr2 = arr.find(function(value, index, arr) {
return value > 9;
})
console.log(arr2) // 10
find()
方法为数组中的每个元素都调用一次函数执行:
- 当数组中的元素在测试条件时返回
true
时,find()
返回符合条件的元素,之后的值不会再调用执行函数。 - 如果没有符合条件的元素返回
undefined
find()
对于空数组,函数是不会执行的。
3.3 .findIndex(callback)
功能: array.findIndex()
和 array.find()
十分类似,返回第一个符合条件的数组元素的位置,如果所有元素都不符合条件,则返回-1
。
返回值: 返回第一个符合条件的数组元素的位置,如果所有元素都不符合条件,则返回-1
。
是否改变原数组: 否
案例:
var arr = [1, 5, 10, 15];
var arr2 = arr.findIndex(function(value, index, arr) {
return value > 9;
})
console.log(arr2) // 2
3.4 for()循环
语法: 遍历数组,然后 if 判断
var arr = [1, 5, 10, 15];
for(let i=0; i<arr.length; i++) {
if(arr[i] === 查找值) {
//则包含该元素
}else{
//不包含该元素
}
}
3.5 .include(searchElement,fromIndex)
功能: 该方法用来判断一个数组是否包含一个指定的值,如果包含返回 true
,否则返回false
。
是否改变原数组: 否
参数:
searchElement
(必填) ⇒ 需要查找的元素值。fromIndex
(可选) ⇒ 开始查找的位置。
案例:
案例1:
let site = ['runoob', 'google', 'taobao'];
site.includes('runoob'); // true
site.includes('baidu'); // false
案例2:
var arr = ['a', 'b', 'c'];
arr.includes('c', 3); //false
arr.includes('c', 100); // false
上面代码表示,如果fromIndex
大于等于数组长度 ,则返回 false
。该数组不会被搜索 。
案例2:
var arr = ['a', 'b', 'c'];
arr.includes('a', -100); // true
arr.includes('b', -100); // true
arr.includes('c', -100); // true
// 数组长度是3
// fromIndex 是 -100
// computed index 是 3 + (-100) = -97
上面代码表示,如果 fromIndex
为负值,计算出的索引将作为开始搜索searchElement
的位置。如果计算出的索引小于 0
,则整个数组都会被搜索。
3.6 .some(callback)
功能: 用于检测数组中的元素是否满足指定条件。
返回值: 如果有一个元素满足条件,则表达式返回true
, 剩余的元素不会再执行检测。如果没有满足条件的元素,则返回false
。
是否改变原数组: 否
案例:
var ages = [3, 10, 18, 20];
var age = ages.some((v,i)=>{
return v == 18
})
console.log(age) // true
console.log(ages) //[3, 10, 18, 20]
3.7 .every(callback)
功能: 用于检测数组中的元素是否全部满足指定条件。
返回值: 如果有所有元素都满足条件,则表达式返回true ,只要有一个没有满足条件的元素,则返回false。
是否改变原数组: 否
案例:
let arr = [1,2,3,4,5]
let arr1 = arr.every( (i, v) => i < 3)
console.log(arr1) // false
let arr2 = arr.every( (i, v) => i < 10)
console.log(arr2) // true
4、.join() -- 转字符串
功能: 将数组中所有元素都转化为字符串并连接在一起。
使用场景: 数组转字符串。
返回值: 字符串
是否改变原数组: 否
案例:
var arr1 = [1,2,3,4,5,6];
var arr2 = arr1.join();
console.log(arr2) // 1,2,3,4,5,6
console.log(arr1) // [1, 2, 3, 4, 5, 6]
5、.reverse() -- 倒序
功能: 将数组反转。
使用场景: 数组倒序。
是否改变原数组: 是
返回值: 反转后的数组
案例:
let arr = [1,2,3,4,5]
console.log(arr.reverse()) // [5,4,3,2,1]
console.log(arr) // [5,4,3,2,1]
6、.concat() -- 拼接
功能: 用于连接两个或多个数组。
使用场景: 数组拼接。
是否改变原数组: 否
参数:
- 字符串
- 数组
案例:
var arr1 = [1,2,3,4,5,6];
var arr2 = [11,12,13,14,15];
var arr3 = ['a','b','c','d','e','f'];
// 把 concat() 中的参数连接到数组
arr1.concat(7,8,9) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(arr1) // [1, 2, 3, 4, 5, 6]
// 连接两个数组
arr1.concat(arr2) // [1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15]
console.log(arr1) // [1, 2, 3, 4, 5, 6]
// 连接三个数组
arr1.concat(arr2,arr3) // [1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, "a", "b", "c", "d", "e", "f"]
console.log(arr1) // [1, 2, 3, 4, 5, 6]
7、.sort() -- 排序
功能: 排序
使用场景: 数组排序
是否改变原数组: 是
参数:
- 无参数 ⇒ 按照字符编码的顺序进行排序。
- 有参数 ⇒ 必须是函数。
案例:
// 按照字符编码的顺序进行排序
let arr = [2,10,6,1,4,22,3]
console.log(arr.sort()) // [1, 10, 2, 22, 3, 4, 6]
// 升序排序
let arr1 = arr.sort((a, b) => a - b)
console.log(arr1) // [1, 2, 3, 4, 6, 10, 22]
// 降序排序
let arr2 = arr.sort((a, b) =>b-a)
console.log(arr2) // [22, 10, 6, 4, 3, 2, 1]
console.log(arr) // [22, 10, 6, 4, 3, 2, 1]
8、.slice(start,end) -- 截取
使用场景: 切去索引值start
到索引值end
的数组,不包含end
索引的值。
是否改变原数组: 否
返回值: 切出来的数组
参数: start
⇒ 起始下标、end
⇒ 终止下标
案例:
let arr = [1,2,3,4,5]
console.log(arr.slice(1,3)) // [2,3]
console.log(arr) // [1,2,3,4,5]
9、 遍历数组方法
9.1 普通for循环
语法:
for (语句 1; 语句 2; 语句 3) {
// 要执行的代码块
}
语句 1 在循环(代码块)开始之前执行。
语句 2 定义运行循环(代码块)的条件。
语句 3 会在循环(代码块)每次被执行后执行。
返回值: 没有return
案例:
var arr = [1,2,3,4,5,6];
for(j = 0; j < arr.length; j++) {
console.log(j)
}
console.log(j)
// 0
// 1
// 2
// 3
// 4
// 5
// 6
9.2 优化版for循环
说明: 使用临时变量,将长度缓存起来,避免重复获取数组长度。
使用场景: 较大数组
案例:
var arr = [1,2,3,4,5,6];
for(j = 0,len=arr.length; j < len; j++) {
console.log(j)
}
9.3 .forEach(callback)循环
语法:
arr.forEach(function(value,index,array){
// 要执行的代码块
});
参数:
callback
的参数: value
⇒ 当前索引的值
index
⇒ 索引
array
⇒ 原数组
案例:
let arr = [1,2,3,4,5]
arr.forEach( (value,index,array)=>{
console.log(`value:${value} index:${index} array:${array}`)
})
console.log(arr)
// value:1 index:0 array:1,2,3,4,5
// value:2 index:1 array:1,2,3,4,5
// value:3 index:2 array:1,2,3,4,5
// value:4 index:3 array:1,2,3,4,5
// value:5 index:4 array:1,2,3,4,5
// [1, 2, 3, 4, 5]
9.4 for..in循环
语法:
for(j in arr) {}
案例:
var arr = [1,4,2,5,3,6,8];
for(j in arr) {
console.log(arr[j])
}
// 1
// 4
// 2
// 5
// 3
// 6
// 8
9.5 .map(callback)循环
功能: 映射数组(遍历数组)
使用场景: 对数组的每项元素进行加工
是否改变原数组: 是
返回值: 有return
参数:
callback
的参数: value
⇒ 当前索引的值
index
⇒ 索引
array
⇒ 原数组
案例:
var arr = [1,4,2,5,3,6,8];
var arr2 = arr.map((v,i)=>{
return v*3
})
console.log(arr2)
// [3, 12, 6, 15, 9, 18, 24]
9.6 各种遍历方式的性能对比
分析结果转载于【南北12345678】
分析结果1
以下截图中的数据是,在chrome (支持es6)中运行了100次后得出的结论(每次运行10次,一共10个循环,得到的分析结果)
分析结果2
以下截图数据是,在chrome (支持es6)中运行了1000次后得出的结论(每次运行100次,一共10个循环,得到的分析结果)
10、.filter(callback) -- 过滤器
功能: 过滤数组
使用场景: 过滤数组
是否改变原数组: 否
返回值: 返回一个满足要求的数组。
参数:
callback
的参数: value
⇒ 当前索引的值
index
⇒ 索引
array
⇒ 原数组
案例:
let arr = [1,2,3,4,5]
let arr1 = arr.filter( (i, v) => i < 3)
console.log(arr1) // [1, 2]
console.log(arr) // [1,2,3,4,5]
11、.reduce(callback, initialValue) -- 累加器
功能: 迭代数组的所有项,将数组中的每个值(从左到右)合并,最终计算为一个值。
使用场景: 总价、百分占比
是否改变原数组: 否
案例:
let arr = [0,1,2,3,4]
let arr1 = arr.reduce((preValue, curValue) =>
preValue + curValue
)
console.log(arr1) // 10
callback 的参数:
preValue
⇒(必填) 上一次调用回调返回的值,或者是提供的初始值curValue
⇒(必填) 数组中当前被处理的数组项index
⇒(可选)当前数组项在数组中的索引值array
⇒(可选)原数组
12、.from() -- 伪数组转数组
功能: 将伪数组变成数组,就是只要有length
的就可以转成数组。
使用场景: 将伪数组变成数组
案例:
let str = '12345'
console.log(Array.from(str)) // ["1", "2", "3", "4", "5"]
let obj = {0:'a',1:'b',length:2}
console.log(Array.from(obj)) // ["a", "b"]
13、.of() -- 一组值转数组
功能: 将一组值转换成数组。
案例:
let str = '11'
console.log(Array.of(str)) // ['11']
等价于
console.log(new Array('11')) // ['11]
14、.fill(target, start, end) -- 填充数组
功能: 使用给定的值,填充一个数组。
使用场景: 填充数组
是否改变原数组: 是
参数:
target
⇒ 待填充的元素start
⇒ 开始填充的位置-索引end
⇒ 终止填充的位置-索引(不包括该位置)
案例:
let arr = [1,2,3,4,5];
let arr1 = arr.fill(5)
console.log(arr1) // [5, 5, 5, 5, 5]
console.log(arr) // [5, 5, 5, 5, 5]
let arr = [1,2,3,4,5];
let arr2 = arr.fill(5,2)
console.log(arr2) // [ 1,2,5,5,5 ]
let arr = [1,2,3,4,5];
let arr3 = arr.fill(5,1,3)
console.log(arr3) // [ 1,5,5,4,5 ]
15、.keys() -- 遍历数组的键名
let arr = [1,2,3,4]
let arr2 = arr.keys()
for (let key of arr2) {
console.log(key); // 0,1,2,3
}
16、.values() -- 遍历数组键值
let arr = [1,2,3,4]
let arr1 = arr.values()
for (let val of arr1) {
console.log(val); // 1,2,3,4
}
17、.entries() -- 遍历数组的键名和键值
返回值: 返回迭代数组,迭代数组中每个值 前一个是索引值作为 key
, 数组后一个值作为 value
。
案例:
let arr = [1,2,3,4]
let arr1 = arr.entries()
for (let e of arr1) {
console.log(e); // [0,1] [1,2] [2,3] [3,4]
}
上一节:JavaScript 的数据类型
下一节:JavaScript 的运算符