JS数组方法总结
一、转换方法
1. toString()
// 会给每一项调用toString()然后拼接成字符串
var arr = [1, 0, undefined, null, new Date('2020-01-01'), '1'];
var res = arr.toString();
res // ==> "1,0,,,Wed Jan 01 2020 08:00:00 GMT+0800 (中国标准时间),1"
2. toLocaleString()
// 会给每一项调用toLocaleString()然后拼接成字符串
var arr = [1, 0, undefined, null, new Date('2020-01-01'), '1'];
var res = arr.toLocaleString();
res // ==> "1,0,,,2020/1/1 上午8:00:00,1"
3. join()
// 会给每一项调用toString(),然后根据连接参数拼接成字符串
// 如果没有连接参数则以逗号作为连接参数
// 如果数组中有 null 或者 undefined 会转化为空字符串
var arr = [1, 0, undefined, null, new Date('2020-01-01'), '1'];
var res = arr.join();
res // ==> "1,0,,,Wed Jan 01 2020 08:00:00 GMT+0800 (中国标准时间),1"
二、栈方法、队列方法
1. push()
// 将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
var colors = ['red', 'blue', 'green'];
var count = colors.push('ooo', 'ppp');
colors // ==> ['red', 'blue', 'green', 'ooo', 'ppp'];
count // ==> 5
// 在es6 中添加多个元素还可以这样
var arr = [1, 2];
var count = colors.push(...arr);
count // ["red", "blue", "green", 1, 2]
count // ==> 5
2. pop()
// 从数组中删除最后一个元素,并返回该元素的值。
var colors = ['red', 'blue', 'green'];
var item= colors.pop();
colors // ==> ['red', 'blue'];
item // ==> 'green'
3. unshift()
// 将一个或多个元素添加到数组的开头,并返回该数组的新长度。
var colors = ['red', 'blue', 'green'];
var count = colors.unshift('ooo', 'ppp');
colors // ==> ['ooo', 'ppp', 'red', 'blue', 'green'];
count // ==> 5
// 同样的,es6添加多个元素也可以使用 ... 运算符
var arr = [1, 2];
var count = colors.unshift(...arr);
count // [1, 2, "red", "blue", "green"]
count // ==> 5
4. shift()
// 从数组中删除第一个元素,并返回该元素的值。
var colors = ['red', 'blue', 'green'];
var item = colors.shift();
colors // ==> ['blue', 'green'];
item // ==> 'red'
三、排序方法
1. reverse()
// 将数组中元素的位置颠倒,并返回该数组。
// 数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组。
var arr = [1, 2, 3, 4, 5];
var result = arr.reverse();
arr // ==> [5, 4, 3, 2, 1]
result // ==> [5, 4, 3, 2, 1]
2. sort()
调用 sort() 方法时会调用每一项的 toString() 然后比较得到的字符串,即使每一项都是数字,也会转化成字符比较(即:字符串编码排序)
// 简单的字符排序
var arr = [0, 28, 13, 14, 5];
var result = arr.sort();
arr // ==> [0, 13, 14, 28, 5];
result // ==> [0, 13, 14, 28, 5];
// 数字排序
var arr = [0, 28, 13, 14, 5];
var result = arr.sort((a, b) => a - b);
arr // ==> [0, 5, 13, 14, 28];
result // ==> [0, 5, 13, 14, 28];
// 随机打乱数组
var arr= [0, 28, 13, 14, 5];
var result= arr.sort((a, b) => Math.random() - 0.5);
arr // ==> [0, 5, 13, 14, 28];
result // ==> 随机打乱的数组
四、操作方法
1. concat()
// 用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var colors = ['red', 'blue', 'green'];
var colors2 = colors.concat('ooo', ['ppp', 'iii']);
colors // ==> ['red', 'blue', 'green'];
colors2 // ==> ["red", "blue", "green", "ooo", "ppp", "iii"]
------------------------------
var colors = ['red', 'blue', 'green'];
var colors2 = colors.concat('ooo', [ 'ppp', 'iii', [ 'ddd', 'fff' ] ]);
colors // ==> [ 'red', 'blue', 'green' ];
colors2 // ==> [ "red", "blue", "green", "ooo", "ppp", "iii", ['ddd', 'fff'] ];
2. slice()
截取数组方法,返回截取后的新数组,有两个参数(原数组不会变化) 参数 1:开始截取的位置索引值(支持负数) 参数 2:结束截取的位置索引值(不包含结束位置,默认到最后,支持负数)
var colors = ['red', 'blue', 'green', "ooo", "ppp"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1, 4);
// colors.slice(-2, -1); 等价于 colors.slice(3, 4);
colors // ==> ['red', 'blue', 'green', "ooo", "ppp"];
colors2 // ==> ["blue", "green", "ooo", "ppp"];
colors3 // ==> ["blue", "green", "ooo"];
3. splice()
数组增,删,改方法,删除的那些项组成的数组,有三个参数(原数组会发生变化) 参数 1:开始删除的位置索引值 参数 2:删除的个数(默认删除到最后) 参数 2:需要添加的元素
var colors = ['red', 'blue', 'green'];
var removeItems = colors.splice(0,2);
colors // ==> ["green"];
removeItems // ==> ["red", "blue"];
var colors = ['red', 'blue', 'green'];
var removeItems = colors.splice(1, 0, 'yellow', 'orange');
colors // ==> ["red", "yellow", "orange", "blue", "green"];
removeItems // ==> [];
var colors = ['red', 'blue', 'green'];
var removeItems = colors.splice(1, 2, 'yellow', 'orange');
colors // ==> ["red", "yellow", "orange"];
removeItems // ==> ["blue", "green"];
五、查询方法
1. indexOf() / lastIndexOf()
查找位置,查找均是以严格相等查找(===), 有两个参数 参数 1:要查找的项 参数 2:要查找的起点位置
var arr = [1, 2, 4, 5, 7, '8', '10'];
arr.indexOf(8); // ==> -1
arr.lastIndexOf(8); // ==> -1
arr.indexOf(2); // ==> 1
arr.lastIndexOf(2); // ==> 1
arr.indexOf(5,3); // ==> 3
arr.lastIndexOf(5,3); // ==> 3
arr.indexOf(5,4); // ==> -1
arr.lastIndexOf(5,4); // ==> 3
六、迭代方法
1. every()、 filter()、 forEach()、 map()、 some()
每个方法都有两个参数 参数 1:在每一项运行的函数 参数 2:运行该函数的作用域对象 传入方法的函数接收三个参数
- 1,数组项的值
- 2,该项在数组的位置索引值
- 3,数组对象本身
// every() 对数组中每一项运行给定函数 只有数组中每一项都返回 true ,则返回 true
// some() 对数组中每一项运行给定函数 只要有其中一项返回 true 就直接返回 true
// filter() 对数组中每一项运行给定函数 返回该函数会返回 true 的项组成的数组
// map() 对数组中每一项运行给定函数 返回函数调用的结果组成的数组
// forEach() 对数组中每一项运行给定函数 无返回值
var arr = [33, 44, 55, 66, 77, 88];
arr.forEach(function(item, index, array){
// console.log(item, index, array);
});
var everyArr = arr.every(function(item, index, array){
// console.log(item, index, array);
return item > 70;
});
var someArr = arr.some(function(item, index, array){
// console.log(item, index, array);
return item > 70;
});
var filterArr = arr.filter(function(item, index, array){
// console.log(item, index, array);
return item > 70;
});
var mapArr = arr.map(function(item, index, array){
// console.log(item, index, array);
return item - 1;
});
everyArr // ==> false
someArr // ==> true
filterArr // ==> [77, 88]
mapArr // ==> [32, 43, 54, 65, 76, 87]
七、reduce 方法
1. reduce() / reduceRight()
两个方法都会迭代数组的每一项,然后构建最终返回值 reduce() 从第一项开始;reduceRight() 从最后一项开始 都接收两个参数 参数 1:每一项上调用的函数(传入的函数接收四个参数,1、前一个值,2、当前值,3、当前值的索引,4、数组对象),函数返回任何值都会作为第一个参数自动传给下一项 参数 2:(可选)作为缩小基础的初始值
var numArr = [ 1, 2, 3, 4, 5 ];
var sum = numArr.reduce(function(prev, cur, index, array){
console.log(prev, cur, index, array);
return prev + cur;
});
// 1 2 1 [1, 2, 3, 4, 5]
// 3 3 2 [1, 2, 3, 4, 5]
// 6 4 3 [1, 2, 3, 4, 5]
// 10 5 4 [1, 2, 3, 4, 5]
sum // ==> 15
var numArr = [ 1, 2, 3, 4, 5 ];
var sum = numArr.reduceRight(function(prev, cur, index, array){
console.log(prev, cur, index, array);
return prev + cur;
});
// 5 4 3 [1, 2, 3, 4, 5]
// 9 3 2 [1, 2, 3, 4, 5]
// 12 2 1 [1, 2, 3, 4, 5]
// 14 1 0 [1, 2, 3, 4, 5]
sum // ==> 15
八、ES6 新增方法
参考阮一峰: ECMAScript 6 入门 - 数组的扩展