数组的方法有很多,当初只是一味的学习记忆,却从未总结过,这里方法的特性进行总结,并且标注了一些注意事项
修改数组自身的方法
push()
向数组的末尾添加一个或更多元素并返回新的长度(可以和扩展运算符结合使用)
let arr = [1, 2, 3]
//添加一个元素
let len1 = arr.push(4)
console.log(arr, len1)//[1, 2, 3, 4] 4
//添加多个元素
let len2 = arr.push(5, 6, 7)
console.log(arr, len2)//[1, 2, 3, 4, 5, 6, 7] 7
let arr2 = ['a', 'b', 'c']
//和扩展运算符结合使用,可以用来合并数组,将第二个数组融入第一个
arr.push(...arr2)
console.log(arr)//[1, 2, 3, 4, 5, 6, 7, "a", "b", "c"]
pop()
删除数组的最后一个元素并返回删除的元素(当数组为空时返回undefined)
let arr = [1, 2, 3];
let el = arr.pop();
console.log(arr, el);//[1, 2] 3
unshift()
向数组的开头添加一个或更多元素并返回新的长度,同理可以和扩展运算符结合使用
let arr = [1, 2, 3];
let len = arr.unshift(4, 5, 6);
console.log(arr, len)//[4, 5, 6, 1, 2, 3] 6
shift()
删除数组的第一个元素并返回删除的元素
let arr = [1, 2, 3];
//此时要注意每个下标对应的元素发生了改变
let el = arr.shift();
console.log(arr, el);//[2, 3] 1
reverse()
颠倒数组元素顺序,将数组中元素的位置颠倒并返回该数组
let list = [10000, 11000, 18000, 21000, 15000, 16500]
list.reverse()
console.log(list)// [16500, 15000, 21000, 18000, 11000, 10000]
sort()
方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的,sort()方法接收一个函数function(a,b)作为参数,此时数组会按照调用该函数的返回值排序,
compareFunction(a, b)小于 0 ,那么 a 会被排列到 b 之前;compareFunction(a, b)等于 0 , a 和 b 的相对位置不变compareFunction(a, b)大于 0 , b 会被排列到 a 之前。
let arr = [1, 30, 4, 21, 100000];
arr.sort();
console.log(arr);// [1, 100000, 21, 30, 4]
// 传入函数作为参数(升序排列)
arr.sort((a, b) => {
return a - b;
})
console.log(arr);//[1, 4, 21, 30, 100000]
splice()
splice(index,len,item)
splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值
index:数组开始下标
len: 替换/删除的长度
item:替换的值(可以是多个),删除操作的话 item为空
返回值:由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
替换 ----item为替换的值
let arr = ['a', 'b', 'c', 'd'];
let retArr = arr.splice(1, 2, 'ttt');
//替换掉的也算被删除
console.log(arr, retArr);//['a','ttt','d'] ["b", "c"]
删除 ---- item不设置
let arr = ['a', 'b', 'c', 'd'];
let retArr = arr.splice(1, 2);
console.log(arr, retArr);//["a", "d"] ["b", "c"]
添加---- len设置为0,item为添加的值
let arr = ['a', 'b', 'c', 'd'];
let retArr = arr.splice(1, 0, 'ttt');
console.log(arr, retArr);//["a", "ttt", "b", "c", "d"] []
数组中的迭代方法
filter()
检测数组元素,并返回一个数组,包含所有符合条件的元素
callback参数:value,index,array,this
value:当前正在处理的元素
index:当前正在处理的元素的下标(可选)
array:数组本身(可选)
this:执行回调时用于this的值(可选)
let list = [28, 29, 35, 43, 29, 26, 35, 22, 41, 39];
let arr = list.filter((val) => val >= 35);
console.log(arr);//[35, 43, 35, 41, 39]
forEach()
遍历数组 无返回值
callback参数:同上
let list = [10000, 11000, 18000, 21000, 15000, 16500];
list.forEach((item, index) => {
console.log(item);//10000, 11000, 18000, 21000, 15000, 16500
});
map();
和forEach();一样 区别在于map方法会返回一个数组,新数组的元素是原数组里的元素调用回调函数后返回的结果
let list = [10000, 11000, 18000, 21000, 15000, 16500];
let arr = list.map((item, index) => item * 2);
console.log(arr);//[20000, 22000, 36000, 42000, 30000, 33000]
every();
检测数组中的所有元素是否都符合指定条件,返回一个布尔值
callback参数:同上
注:如果有一个元素不满足条件,则表达式返回false, 剩余的元素不会再执行检测
如果全满足条件的元素,或者数组为空,则返回true
let ages = [3, 10, 18, 20];
let retBool = ages.every((age) => age >= 18)
console.log(retBool);//false
some(); 检测数组中的元素是否满足指定条件,返回一个布尔值
callback参数:同上
注:如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测
如果没有满足条件的元素,或者数组为空,则返回false
let ages = [3, 10, 18, 20];
let retBool = ages.some((age) => age >= 18)
console.log(retBool);//true
find();
返回第一个符合条件的数组成员,否则返回undefined
callback参数:同上
let arr = [1, 5, 10, 15];
let retVal = arr.find((value) => value > 9);
console.log(retVal);//10
findIndex()
方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置
当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。
如果没有符合条件的元素返回 -1
let ages = [3, 10, 18, 20];
let retval = ages.findIndex( val => val > 3)
console.log(retval);
reduce(function(total,currentValue,index,arr),initialValue)
callback参数:total,currentValue,currentIndex,arr
total: 初始值, 或者计算结束后的返回值
currentValue:当前元素
currentIndex: 当前元素的索引(可选)
arr:当前元素所属的数组对象(可选)
initialValue:传递给函数的初始值(可选)
let numbers = [15.5, 2.3, 1.1, 4.7];
//数组求和
function getSum(total, num) {
return total + num;
}
numbers.reduce(getSum, 0);//23.6
在使用迭代方法时应注意数组中的元素是对象的情况,这里我们以map为例
const arr = [
{ name: 'Tom', age: 16 },
{ name: 'Aaron', age: 18 },
{ name: 'Denny', age: 20 }
]
const result = arr.map(item => {
item.age = item.age + 2;
return item
});
console.log('arr', arr);// [ { name: 'Tom', age: 16 },{ name: 'Aaron', age: 18 },{ name: 'Denny', age: 20 }]
console.log('result', result);// [ { name: 'Tom', age: 16 },{ name: 'Aaron', age: 18 },{ name: 'Denny', age: 20 }]
//所以我们以前说的“map()不会改变原始数组”这句话并不严谨。
//而应该是“当数组中元素是值类型,map不会改变原数组;当是引用类型,则可以改变原数组”
数组的存取方法
concat();
合并两个或多个数组,并返回一个新数组 (建议使用扩展运算符代替)
let a = [1, 2];
let b = [4, 5];
let c = a.concat(b);
let d = a.concat(b, c)
console.log(c, d)//[1, 2, 4, 5] [1, 2, 4, 5, 1, 2, 4, 5]
//扩展运算符实现
let e = [...a,...b]
console.log(e)//[1, 2, 4, 5]
join()
在数组元素之间插入字符串,返回一个新的字符串
注:如果数组只有一个成员,那么将直接返回该成员
let arr = [1, 2, 3];
let arr2 = [5];
let str1 = arr.join(",");
console.log(str1);//1,2,3
let str2 = arr2.join(",");
console.log(str2);//5
slice(start,end)
截掉取数组的的一部分,并返回一个新数组
start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推
end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是也可为负数
let list = [10000, 11000, 18000, 21000, 15000, 16500];
let retArr = list.slice(-5, 4)
console.log(retArr)// [11000, 18000, 21000]
indexOf()
返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
let namelist = ["刘庆蒙", "李玉昭"];
let indx = namelist.indexOf("刘庆蒙");
console.log(indx);//0
- indexOf() 方法对大小写敏感!
其他方法
Array.from()
将类数组转变为真正的数组
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
console.log(arrayLike)//{ 0: "a", 1: "b", 2: "c", length: 3 }
let arr = Array.from(arrayLike);
console.log(arr)// ["a", "b", "c"]
flat()
数组扁平化处理
let arr = [1, 2, [3, [4, 5]]]
let arr2 = arr.flat()
console.log(arr2)//[1,2,3,[4,5]]
//传入一个整数参数,表示想要拉平的层数,默认为1。
let arr3 = arr.flat(2)
console.log(arr3)//[1,2,3,4,5]
Array.of()
将一组值,转换为数组
let arr1 = Array.of(3, 11, 8)
console.log(arr1)//[3, 11, 8]
let arr2 = Array.of(3)
console.log(arr2)//[3]
//链式调用
let len = Array.of(3).length
console.log(len)//1
总结
- 遍历数组时使用map和foreach
- 数组的添加删除使用splice、push、pop、shift、unshift
- 检查数组是否符合条件使用every、some
- 查找数据使用find、findIndex
- 筛选使用filter
- 需要用到累加器时使用reduce