数组在业务中很经常使用,这篇写写在业务中常常涉及到的一些关于数组的技术点。数组
学习数组考虑三个方面:是否改变自身、返回值、回调函数返回值数据结构
改变数组自身:pop、push、shift、unshift、splice、sort、reverse函数
不改变数组自身:reduce、slice、indexOf...学习
reduce:this
reduce回调函数中包含4个参数:累积值、当前值、当前索引、原数组;
回调函数返回的是当前循环的累积值;
函数返回的是总的结果;
当不提供初始值时,累积值会将数组第一个值看成值,当前值会将数组第二个值看成值。spa
应用场景:须要进行累积计算的场景prototype
includes、find、from、of...code
find:
找到中止循环,回调函数返回true,find返回找到的值;找不到回调函数返回false,find返回undefined。对象
from:
将伪数组对象或可迭代对象转化成数组;
from有3个参数:想要转换成数组的伪数组对象或可迭代对象、每一个元素会执行的回调函数(可选)、执行回调函数mapFn
时this
对象;
返回新数组。blog
可迭代对象(部署了Iterator接口的数据结构): Set、 Map...
伪数组: 有length
属性的对象(arguments、{length: 3}...)。
* var arr = []; arr.length = 8; * new Array(8) * Array.from({length: 8}) * arr[8] = null
以上获得的新数组数组长度都为8
经过下标指定的数组,数组长度为9
for...in遍历数组:
数组索引数字会变为字符串
会遍历数组的私有属性
let arr = ['you','uu','tt'] arr.b = 'haha' <!--for(let i=0; i<arr.length; i++) {--> <!-- console.log(arr[i])--> <!--}--> for(let key in arr) { console.log(key,arr[key]) }
//Es5写法 Array.prototype.slice.call(arguments) //Es6写法 Array.from(arguments)
索引值不存在当前数组中的状况:
一、数组经过数字进行索引,直接经过指定索引设置数组值会改变数组长度。
二、索引能够是字符串,索引若是能够强制转化成十进制数字,那么就能够计算在数组长度中,不然不能够
let a = []; a[1] = 2 a.length //2 a['foobar'] = 'youyi' a.foobar //'youyi' a.length//2
let b = [] b["14"] = 34 console.log(b.length) //15
一、 {1:123, 2:231, 5:888} 转化为 [123, 231, null, null, 888, null, null, null]
function objectToArr(obj,len) { let arr = []; for(let key in obj) { arr[key-1] = obj[key] } if(len) arr.length = len; arr = Array.from(arr, function(v, i) {return v || null}) return arr } console.log(objectToArr({1:123, 2:231, 5:888}, 8)) //[123, 231, null, null, 888, null, null, null]
更聪明简洁的写法:
function objectToArr(obj,len) { return Array.from({length: len}, function(v, i) { return obj[i+1] || null }) } console.log(objectToArr({1:123, 2:231, 5:888}, 8))