js 数组

233 阅读10分钟

数组属性与方法

属性

属性描述
constructor返回创建数组对象的原型函数。
length设置或返回数组元素的个数。
prototype允许你向数组对象添加属性或方法。

方法

concat(array2,array3,...,arrayX)

拼接多个数组

是否改变原数组:否
返回值: 新数组

属性描述
array2, array3, ..., arrayX必需。该参数可以是具体的值,也可以是数组对象。可以是任意多个。
var arr = [1,2]
console.log(arr.concat([3,4],[5,6],[7,8])) // [ 1, 2, 3, 4, 5, 6, 7, 8 ]
console.log(arr) //[ 1, 2 ]
var arr = [1,2]
console.log(arr.concat(3,4)) // [ 1, 2, 3, 4 ]
console.log(arr) // [ 1, 2 ]

copyWithin(target, start, end)

用于从数组的指定位置拷贝元素到数组的另一个指定位置中。IE 11 及更早版本不支持 copyWithin() 方法。(ECMAScript 6)

是否改变原数组:是
返回值:原数组

属性描述
target必需。复制到指定目标索引位置。
start可选。元素复制的起始位置。默认0
end可选。停止复制的索引位置 (默认为 array.length)。如果为负值,表示倒数。
// 把[2,3]复制到[4,5]的位置
var arr = [1,2,3,4,5,6,7,8,9]
console.log(arr.copyWithin(3,1,3)) // [ 1, 2, 3, 2, 3, 6, 7, 8, 9 ]
console.log(arr) // [ 1, 2, 3, 2, 3, 6, 7, 8, 9 ]
// 不会超出原始长度
var arr = [1,2,3,4,5,6,7,8,9]
console.log(arr.copyWithin(3)) // [ 1, 2, 3, 1, 2, 3, 4, 5, 6 ]
console.log(arr) // [ 1, 2, 3, 1, 2, 3, 4, 5, 6 ]
var arr = [1,2,3,4,5,6,7,8,9]
console.log(arr.copyWithin(3, -3, -1)) // [ 1, 2, 3, 7, 8, 6, 7, 8, 9 ]
console.log(arr) // [ 1, 2, 3, 7, 8, 6, 7, 8, 9 ]

entries

对键值对的遍历。 (ECMAScript 6)

是否改变原数组:否
返回值:遍历器对象

var arr = ['a','b']
for (let item of arr.entries()) {
    console.log(item) // [ 0, 'a' ] // [ 1, 'b' ]
}
console.log(arr) // [ 'a', 'b' ]

keys

对键名的遍历。 (ECMAScript 6)

是否改变原数组:否
返回值:遍历器对象

var arr = ['a','b']
for (let item of arr.keys()) {
    console.log(item) // 其实就是对应的数组索引值
}
console.log(arr)

values

对键值的遍历。 (ECMAScript 6) (node v8.9.0不支持,12.19.0支持,中间版本未测)

是否改变原数组:否
返回值:遍历器对象

var arr = ['a','b']
for (let item of arr.values()) {
    console.log(item) // 其实就是对应的数组元素值
}
console.log(arr)

every

用于检测数组所有元素是否都符合指定条件。当遍历到不符合条件的元素后不再继续遍历后面的元素(类似循环中的break)。空数组返回true

是否改变原数组:否
返回值:Boolean
参数:
第一个必填,是一个函数,数组中的每个元素都会执行这个函数,函数的返回值也为Boolean;
第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var arr = [1,2,3]
console.log(arr.every(check))
function check(val, index, arr) {
    // return val > 0  // true
    return val > 1 // false
}

some

用于检测数组是否存在元素符合指定条件。当遍历到符合条件的元素后不再继续遍历后面的元素(类似循环中的break)。空数组返回false

是否改变原数组:否
返回值:Boolean
参数:
第一个必填,是一个函数,数组中的每个元素都会执行这个函数,函数的返回值也为Boolean;
第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var arr = [2,-1,3]
console.log(arr.some(check))
function check(val, index, arr) {
    return val < 0  // true
    // return val > 5 // false
}
// some第二个参数具体有啥用?
var arr = [2,-1,3]
console.log(arr.some(check, [4,5,6]))
function check(val, index, arr) {
    console.log(this) // [ 4, 5, 6 ]
    console.log(val)
    return val < 0
    // return val > 5
}

map

返回一个新数组,新数组元素为原数组元素逐个依次调用回调函数后返回的值。空数组返回空数组

是否改变原数组:否
返回值:新数组
参数:
第一个必填,是一个函数,数组中的每个元素都会执行这个函数,函数需返回一个值,否则新数组中的元素均为undefined;
第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var arr = [1,2,3]
console.log(arr.map(check)) // [ 2, 3, 4 ]

function check(val ,index, arr) {
    return val+1
}

filter

返回一个新数组,新数组元素为原数组元素符合条件的元素。空数组返回空数组

是否改变原数组:否
返回值:新数组
参数:
第一个必填,是一个函数,数组中的每个元素都会执行这个函数,函数需返回Boolean,返回true的对应的元素加入新数组;
第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var arr = [1,2,3]
console.log(arr.filter(check)) // [ 2, 3 ]

function check(val ,index, arr) {
    return val>1
}

reduce

接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。数组不能为空

是否改变原数组:否
返回值:一个值
参数:
第一个必填,是一个函数,计算上一次计算的返回值(或初始值)与当前值的关系,返回计算的结果
第二个initialValue,可选。传递给函数的初始值。为空时,数组的第一项作为total的初始值?

函数的参数:

参数描述
total必需。初始值, 或者计算结束后的返回值。
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身

var arr = [1,2,3]
console.log(arr.reduce((total, cur, index, arr) => {
    return total-cur
})) // -4

reduceRight

与reduce类似,区别是 reduceRight() 从数组的末尾向前将数组中的数组项做累加

var arr = [1,2,3]
console.log(arr.reduceRight((total, cur, index, arr) => {
    return total-cur
})) // 0

forEach

用于调用数组的每个元素,并将元素传递给回调函数。

是否改变原数组:否
返回值:undefined 参数:
第一个必填,是一个函数 第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var arr = [1,2,3]
arr.forEach(check)

function check(val ,index, arr) {
    console.log(val) 
}

find

返回符合条件的第一个元素

是否改变原数组:否
返回值: 参数:
第一个必填,是一个函数,返回值为Boolean 第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var fruits = ["Banana", "Orange", "Apple", "Mango"];
console.log(fruits.find(findOrange));  // Orange

function findOrange(cur, index, arr) {
    return cur == 'Orange'
}

findIndex返回值为元素的索引

同find,区别是findIndex返回值为元素的索引

pop

用于删除数组的最后一个元素,并返回删除的元素。改变原数组

push

向数组的末尾添加一个或多个元素,并返回新的长度。改变原数组

shift

把数组的第一个元素从其中删除,并返回第一个元素的值。改变原数组

unshift

向数组的开头添加一个或多个元素,并返回新的长度。改变原数组

fill(value, start, end)

将一个固定值替换数组的元素。(ECMAScript 6)

是否改变原数组:是
返回值:原数组

属性描述
value必需。填充的值。
start可选。开始填充位置。默认0。可为负数
end可选。停止填充位置 (默认为 array.length)。可为负数

flat

将嵌套数组拉平。

是否改变原数组:否
返回值:新数组
参数:空/Number/Infinity

var arr = [1,2,3, [5,6,7]]
console.log(arr.flat()) // [ 1, 2, 3, 5, 6, 7 ]
console.log(arr) // [ 1, 2, 3, [ 5, 6, 7 ] ]

flatMap

相当于先执行map方法再执行一次flat,但此时flat只能展开一层嵌套

是否改变原数组:否
返回值:新数组
参数:
第一个必填,是一个函数,返回值为Boolean 第二个thisValue,可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

函数的参数:

参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。数组对象本身
var arr = [1,2,3]
console.log(arr.flatMap(n => [n * 2])) // [ 2, 4, 6 ]
console.log(arr)
var arr = [1,2,3]
console.log(arr.flatMap((x) => [[x, x * 2]])) // [ [ 1, 2 ], [ 2, 4 ], [ 3, 6 ]]
console.log(arr) // [1,2,3]

includes

用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。

是否改变原数组:否
返回值:Boolean

参数描述
searchElement必须。需要查找的元素值。
index可选。当前元素的索引值

indexOf

返回数组中某个指定的元素位置

是否改变原数组:否
返回值:Number

参数描述
searchElement必须。需要查找的元素值。
start可选。规定在数组中开始检索的位置。

lastIndexOf

返回一个指定的字符串值最后出现的位置。如果指定第二个参数 start,则在一个字符串中的指定位置从后向前搜索。

是否改变原数组:否
返回值:Number

参数描述
searchElement必须。需要查找的元素值。
start可选。规定在数组中开始检索的位置。

join

把数组中的所有元素转换一个字符串。 元素是通过指定的分隔符进行分隔的。

是否改变原数组:否
返回值:String

参数描述
separator可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

reverse

用于颠倒数组中元素的顺序。

是否改变原数组:是
返回值:Array

var arr = [1,2,3]
console.log(arr.reverse()) // [ 3, 2, 1 ]
console.log(arr) // [ 3, 2, 1 ]

sort

对数组的元素进行排序。默认排序顺序为按字母升序。

是否改变原数组:是
返回值:Array

参数描述
sortfunction可选。规定排序顺序。必须是函数。
var arr = [1,2,3, 10]
console.log(arr.sort((a, b) => a-b))  // [ 1, 2, 3, 10 ]
console.log(arr) // [ 1, 2, 3, 10 ]

slice

从已有的数组中返回选定的元素。

是否改变原数组:否
返回值:Array

参数描述
start可选。选取的起始点。如果是负数则从数组尾部开始计算。默认0
end可选。选取的结束点。如果是负数则从数组尾部开始计算。默认最后一个元素
var arr = [1,2,3, 10] 
console.log(arr.slice(1,2))  // [ 2 ]
console.log(arr) // [1,2,3, 10] 

splice

用于添加或删除数组中的元素。

是否改变原数组:是
返回值:数组,返回被删除的元素

参数描述
index该参数是开始插入和(或)删除的数组元素的下标
howmany可选。规定应该删除多少元素。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
item1, ..., itemX可选。要添加到数组的新元素
var arr = [1,2,3, 10]
console.log(arr.splice(1,2,[3,4,5]))  // [ 2, 3 ]
console.log(arr) // [ 1, [ 3, 4, 5 ], 10 ]