一、类数组
类数组不是数组,类数组指拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字 符串来处理且不具有数组所具有的方法;
如函数中的arguments:
- let arg = null;
- function fun(a,b,c,d){
- arg = arguments;
- }
- fun(1,2,3,4)
- console.log(arg); //Arguments(4) [1, 2, 3, 4, callee: ƒ ,
- Symbol(Symbol.iterator): ƒ]
- arg.slice() //ncaught TypeError: Cannot read property 'slice' of null
类数组转换为数组主要有一下方法:
1.Array.prototype.slice.call()
- Array.prototype.slice.call(arg) // [1, 2, 3, 4]
- Array.prototype.slice.call(arg).indexOf() //-1
2.Array.from()
- Array.from(arg) //[1, 2, 3, 4]
- Array.from(arg).indexOf() //-1
3. ...扩展运算符
- [...arg] //[1, 2, 3, 4]
- [...arg].indexOf() //-1
4.concat+apply
- Array.prototype.concat.apply([], arg) //[1, 2, 3, 4]
- Array.prototype.concat.apply([], arg).indexOf() //-1
二、数组遍历API
1.map
map不修改原数组,根据传入的函数,映射出一个全新的数组
- let arr = [1 ,2 ,3];
- let res = arr.map((value)=>{
- return value + 1;
- })
- console.log(res) //[2, 3, 4]
2.foreach
遍历数组,不可中断,没有返回值
- let arr = [1 ,2 ,3];
- arr.forEach((value)=>{
- console.log(value) //分别打印1,2,3
- });
3.some
遍历数组,检查是否有符合条件的数据,至少有一个则返回true ,一个都没有返回false
- let arr = [1 ,2 ,3];
- let res = arr.some((value)=>{
- return value > 2
- });
- console.log(res) //true
- let arr = [1 ,2 ,3];
- let res = arr.some((value)=>{
- return value > 3
- });
- console.log(res) //false
4.every
遍历数组,检查是否所有数据都符合条件,是则true ,否则false
- let arr = [1 ,2 ,3];
- let res = arr.every((value)=>{
- return value > 0
- });
- console.log(res) //true
- let arr = [1 ,2 ,3];
- let res = arr.every((value)=>{
- return value > 1
- });
- console.log(res) //false
5.reduce
reduce()方法接收一个回调函数作为第一个参数,回调函数又接受四个参数,分别是;
1、 previousValue =>初始值或上一次回调函数叠加的值;
2、 currentValue => 本次回调(循环)将要执行的值;
3、 index=>“currentValue”的索引值;
4、 arr => 数组本身;
reduce()方法返回的是最后一次调用回调函数的返回值;
- let arr = [1 ,2 ,3];
- let res = arr.reduce((sum, value)=>{
- return sum + value;
- });
- console.log(res) //6
6.find
返回符合条件的数据内容
- let arr = [
- {id:1, {id:2, {id:3,value:3},
- value:4},
- value:5},
- ];
- let res = arr.find((current)=>{
- return current.value > 4;
- });
- console.log(res) //{id: 3, value: 5}
7.filter
顾名思义,过滤,按照传入的规则过滤不符合条件的数据,将符合条件的数据放入一个新数组
- let arr = [
- value:3},
- value:4},
- value:5},
- ];
- let res = arr.filter((current)=>{
- return current.value > 3;
- });
- console.log(res) //[{id:2, value:4}, {id:3, value:5}]
三、多维数组扁平化
以下以这段数据为例:
let arr = [1, [2, 3], [[4, 5, 6], 7, 8]]
1.flat
es6的flat ,但是一次只能拆分一层
- arr.flat() //[1, 2, 3, [4, 5, 6], 7, 8]
2.正则表达式
在字符串中匹配到'['或者']' ,将其去除,但是这样做会将所有的数组元素变为字符类型,而且数组元素中 还不能包含'['或者']'
- <P>JSON.stringify(arr).replace(/(\[|\])/g,</P>
- <P>"5", "6", "7", "8"]'').split(',')//["1", "2", "3", "4",</P>
3.普通的递归
- let result = [];
- let fn = function(ary) {
- for(let i = 0; i < ary.length; i++) { let item = ary[i];
- if (Array.isArray(ary[i])){
- fn(item);
- } else {
- result.push(item);
- }
- }
- }
4...扩展运算符
- while (arr.some(Array.isArray)) {
- arr = [].concat(...arr);
- }