Array
1. 静态方法
可以直接通过 Array.方法名 调用,故为静态方法
-
转化方法
-
把 json 对象转换成数组
Array.from(json对象);
-
-
参数要满足:key 必须是 0,1,2(数字或字符串均可),还有 length,比如类数组 arguments 对象就很合适
- 把一堆独立的数字,字符串或变量,合成数组
Array.of(数字1,字符串1,数字2,变量1....)
- 把一堆独立的数字,字符串或变量,合成数组
-
判断方法
- 判断是否为数组
const bool = Array.isArray(arr);
- 判断是否为数组
2.原型方法
是通过Array.prototype.方法名挂载上去的,故为原型方法
需要用过数组.方法名来调用
ES5 之前
会影响数组内部元素
- 添加与删除
- 尾部添加多个元素,返回操作后数组的 length
length = 数组.push(elem1,elem2...) - 删除尾部最后一个元素,并返回此元素
last = 数组.pop(); - 头部添加多个元素,返回操作后数组的 length
length = 数组.unshift(elem1,elem2...) - 删除头部第一个元素,并返回此元素
first = 数组.shift();
- 尾部添加多个元素,返回操作后数组的 length
- 整个操作
- 删除某位置开始的 n 个元素,且可添加新元素补充进去,返回被删除的元素
数组.splice(开始删除处的索引,要删除的元素数目,elem1,elem2...) - 把数组元素颠倒,不仅自身变化,同时会返回颠倒后的结果
const rev = 数组.reverse(); - 排序,如果不加参数,将按照字符编码顺序,不仅自身变化,同时会返回排序后的结果
const sor = 数组.sort(比较函数); //比较函数有两个参数a和b //若返回大于0,代表a应该在b的前面- 注意:对数字排序不可靠,所以要给函数按算术大小排序
userArray.sort((a, b) => b - a); - 例子:中文按拼音排序
userArray.sort(function (a, b) { return a.localeCompare(b); });
- 注意:对数字排序不可靠,所以要给函数按算术大小排序
- 删除某位置开始的 n 个元素,且可添加新元素补充进去,返回被删除的元素
不影响内部数组元素(仅访问)
-
concat- 链接多个数组,返回链接后的一个新数组
const combine = 数组.concat(array1, array2...)
- 链接多个数组,返回链接后的一个新数组
-
slice- 返回选定位置的数组元素,包括 begin 但不包括 end
const part = 数组.slice(begin[, end])
- 返回选定位置的数组元素,包括 begin 但不包括 end
-
join- 给定分隔符,拼接数组中的元素,返回拼接后的字符串
const str = 数组.join(分隔符);
- 给定分隔符,拼接数组中的元素,返回拼接后的字符串
ES5 加入的新方法
不影响内部数组元素(仅访问)
-
查找
- 从头部的 fromIndex 处 开始向后找,返回第一个找到的索引号,找不到则返回-1
数组.indexOf(要查的元素[, fromIndex]) - 从尾部的 fromIndex 处 向前开始找,返回第一个找到的索引号,找不到则返回-1
数组.lastIndexOf(要查的元素[, fromIndex]) - 注意:对 NaN 会有强对比误判,谨慎使用,更推荐用新的.includes
- 从头部的 fromIndex 处 开始向后找,返回第一个找到的索引号,找不到则返回-1
-
迭代
-
forEach遍历数组,在 callback 函数中做处理,函数有三个参数:velue,index,array数组.forEach(callback,提供callback的新this指向)- 注意:
- forEach 无法通过 break 来中断遍历,只能用 try 方法抛出异常来中断跳出
- 也不能用 return,因为只是从某一个 callback 中返回,还是会继续执行
- 这里第二个参数要留意,仅在普通函数时提供有效,箭头函数的 this 是被固定的
- 注意:
-
map遍历数组,在 callback 函数中对每个元素做相同运算,并最终返回一个新数组,来表达所有运算后的结果const newArray = 数组.map(callback,提供callback的新this指向)- 注意:
- 使用 map 时一定要记得在 callback 中进行显式 return,否则最终返回的就是全 undefined 数组
- 注意:
-
filter遍历数组,在 callback 函数中对每个元素做相同筛选,函数如果返回 true,就留下此元素,最终返回一个新数组,来表达所有留下的元素const newArray = 数组.filter(callback,提供callback的新this指向) -
every遍历数组,在 callback 函数中对每个元素做判断,只有每个元素都返回 true,最终结果才为 trueconst bool = 数组.every(callback,提供callback的新this指向) -
some遍历数组,在 callback 函数中对每个元素做判断,一旦有一个元素返回 true,最终结果就是 trueconst bool = 数组.some(callback,提供callback的新this指向)- 如果数组为空,那永远返回 false
- 只会在被赋值的数组项上调用 callback
-
reduce遍历数组,在累加器函数中做处理,total 是总值,currentValue 是每次迭代的元素值,currentIndex 是每次迭代的索引值,initialValue 是第一次迭代开始的初始值(可不写,默认 0),最终返回累加器处理完的总值result = 数组.reduce(累加器函数(total, currentValue, currentIndex, arr){ }, initialValue) //还有反向遍历数组,在累加器函数中做处理 数组.reduceRight()
-
ES6 加入的新方法
会影响数组内部元素
-
整个操作
-
从外部填充数据 到某段位置
数组.fill(替换数据源,开始替换的位置,结束替换的位置)- 比如
[1, 2, 3, 4, 5, 6].fill('a', 2, 4)- 表示把 a 填到 2 号位和 3 号位,不包括 4 号
- 本质是填充到原有位置
- 结果是
[1, 2, 'a', 'a', 5, 6]
- 比如
-
用自身填充数据 到某段位置
数组.copyWithin(开始替换的位置,替换数据源的开始位置,替换数据源的结束位置)- 参数
- 参数 2 可选,默认为 0,可用负值表示从最后一个(-1)开始数
- 参数 3 可选,默认为数组长度,直到无法读为止
- 比如
[1, 2, 3, 4, 5].copyWithin(0, 3)- 表示把 3 号位开始的 4,5 替换到 0 号位,1 号位去
- 结果是
[4, 5, 3, 4, 5]
- 参数
-
不影响内部数组元素(仅访问)
-
查找
- 从头部开始向后找,条件语句返回 true 则代表符合,直接返回值
数组.find(function (value, index, arr) { return 条件语句; }); - 从头部开始向后找,条件语句返回 true 则代表符合,直接返回索引
数组.findIndex(function(value, index, arr return 条件语句 }) - 从头部的 fromIndex 处开始向后找,返回布尔值,表示是否找到
数组.includes(要查的元素[, fromIndex])- 修复了 indefOf 中对 NaN 的强对比误判
- 比如
[1, 2, NaN].indexOf(NaN);会返回-1,是有问题的 - 而
[1, 2, NaN].includes(NaN);会返回 true,没问题
- 比如
- 修复了 indefOf 中对 NaN 的强对比误判
- 从头部开始向后找,条件语句返回 true 则代表符合,直接返回值
-
遍历方法
-
遍历值
for(let item of arr) //等价于 for(let item of arr.values()) -
遍历键
let arr = [1, 2, 3]; for (let index of arr.keys()) { console.log(index); } for (let index in arr) { console.log(index); }- 不建议用 for in 去遍历键,因为会把原型上的属性和方法都遍历出来(一般是没有的,多出现在你对 arr 进行了其他属性或原型方法赋予),除非你愿意在内部用 hasOwnPropery 做过滤
-
遍历键值对
for(let [index, value] of arr.entries())
-
ES6 之后的方法
不影响内部数组元素
-
扁平化方法
-
把数组按指定维度降维,进而扁平化
数组.flat(维度);- 维度如果不给,默认是 1,只会降低 1 维
- 例子
let result = ["1", ["2", ["3", ["4"]]]].flat(); console.log(result); // [ '1', '2', [ '3', ['4'] ] ]
- 例子
- 如果想完全扁平,维度可以填
Infinity- 例子
let result = ["1", ["2", ["3", ["4"]]]].flat(Infinity); console.log(result); // ['1', '2', '3', '4']
- 例子
- 维度如果不给,默认是 1,只会降低 1 维
-
在 map 的同时,把结果进行扁平化处理
数组.flatMap((item) => 对每个元素的操作返回);- 例子
- 仅用 map
let result = ["My name", "is Tom"].map((item) => item.split(" ")); console.log(result); // [['My', 'name'], ['is', 'Tom']] - 用 flatMap
let result = ["My name", "is Tom"].flatMap((item) => item.split(" ")); console.log(result); // ['My', 'name', 'is', 'Tom']
- 仅用 map
- 例子
-