数组

Mr.ZhaoAbout 5 min

1. 创建和初始化数组

[]

const arr = [1,2,3]

new Array()

const arr = new Array(1,2,3)

大多数时候我们有“创造指定长度的空数组”这样的需求:

// 长度为7的空数组
const arr = new Array(7)

我们还会有“创建一个长度确定、同时每一个元素的值也都确定的数组“的需求,可以使用fill方法:

// 长度为7,且每个元素都初始化为1的数组
const arr = (new Array(7)).fill(1)

2. 数组的访问和遍历

1. 访问

访问数组中的元素,我们直接在中括号中指定其索引即可:

// 访问索引下标为0的元素
arr[0]

2. 遍历

1. for循环

推荐使用

// 获取数组的长度
const len = arr.length
for(let i=0;i<len;i++) {
    // 输出数组的元素值,输出当前索引
    console.log(arr[i], i)
}

2. forEach方法

通过取 forEach 方法中传入函数的第一个参数和第二个参数,我们也可以取到数组每个元素的值及其对应索引

arr.forEach((item, index)=> {
    // 输出数组的元素值,输出当前索引
    console.log(item, index)
})

3. map方法

map 方法在调用形式上与 forEach 无异,区别在于 map 方法会根据你传入的函数逻辑对数组中每个元素进行处理、进而返回一个全新的数组

map 做的事情不仅仅是遍历,而是在遍历的基础上“再加工”

const newArr = arr.map((item, index)=> {
    // 输出数组的元素值,输出当前索引
    console.log(item, index)
    // 在当前元素值的基础上加1
    return item+1
})
// 这段代码就通过 map 来返回了一个全新的数组,数组中每个元素的值都是在其现有元素值的基础上+1后的结果

3. 二维数组

const arr = [
  [1,2,3,4,5],
  [1,2,3,4,5],
  [1,2,3,4,5],
  [1,2,3,4,5],
  [1,2,3,4,5]
]

二维数组的别名就叫“矩阵”

1. 二维数组的初始化

不能使用fill方法来初始化,因为给 fill 传递一个参数时,如果这个参数的类型是引用类型,那么 fill 在填充坑位时填充的其实就是参数的引用

我们可以用for循环来实现:

const len = arr.length;
for(let i=0;i<len;i++) {
    // 将数组的每一个坑位初始化为数组
    arr[i] = [];
}

也可以使用如下方法实现:

const arr = new Array(n).fill(0).map(() => new Array(n).fill(0));

2. 二维数组的访问

// 缓存外部数组的长度
const outerLen = arr.length
for(let i=0;i<outerLen;i++) {
    // 缓存内部数组的长度
    const innerLen = arr[i].length
    for(let j=0;j<innerLen;j++) {
        // 输出数组的值,输出数组的索引
        console.log(arr[i][j],i,j)
    }
}

一维数组用 for 循环遍历只需一层循环,二维数组是两层,三维数组就是三层。依次类推,N 维数组需要 N 层循环来完成遍历

4. 数组常见操作

1. 数组的增删改查

1. 增加元素

// unshift 方法-添加元素到数组的头部
const arr = [1,2]
arr.unshift(0) // [0,1,2]
// push 方法-添加元素到数组的尾部
const arr = [1,2]
arr.push(3) // [1,2,3]
// splice 方法-添加元素到数组的任何位置
// 第一个参数是起始的索引值,第二个参数表示从起始索引开始需要删除的元素个数,从第三个位置开始的参数,都代表着需要添加到数组里的元素的值
const arr = [1,2] 
arr.splice(1,0,3) // [1,3,2]

2. 删除元素

// pop 方法-删除数组最后的元素
const arr = [1,2]
arr.pop() // [1]
// shift 方法-删除数组首位的元素
const arr = [1,2]
arr.shift() // [2]
// splice 方法-删除数组任意位置的元素
const arr = [1, 2, 3, 4, 5]
//删除索引3位置起两个元素
arr.splice(3, 2)
console.log(arr) //[1,2,3]

3. 修改元素

//splice()第二个参数为1时,可以修改指定索引位置的元素
let arr = [1, 2, 3, 4, 5]
//修改索引1位置的元素为A
arr.splice(1, 1, 'A')
console.log(arr) //[1, 'A', 3, 4, 5]
//splice()第二个参数为n时,可以修改指定索引位置的n个元素
let arr1 = [1, 2, 3, 4, 5]
//修改索引1位置开始的两个元素为A、B
arr1.splice(1, 2, 'A', 'B')
console.log(arr1) //[1, 'A', 'B', 4, 5]

4. 查找元素

indexOf,lastIndexOf,find,findIndex,findLast,findLastIndex,includes

let arr = [10, 11, 12, 13, 9]
console.log(arr.indexOf(15))//-1
console.log(arr.indexOf(11))//1
console.log(arr.lastIndexOf(15))//-1
console.log(arr.lastIndexOf(11))//1
console.log(arr.includes(10))//true
let res1 = arr.find((item) => item > 10)
console.log(res1)//11
let res2 = arr.findLast((item) => item > 10)
console.log(res2)//13
let res3 = arr.findIndex((item) => item > 10)
console.log(res3)//1
let res4 = arr.findLastIndex((item) => item > 10)
console.log(res4)//3

2. 数组排序

sort

let arr = [3, 2, 4, 6, 5]
arr.sort((x, y) => x - y)
console.log(arr) //[2, 3, 4, 5, 6]
let arr = [3, 2, 4, 6, 5]
arr.sort((x, y) => y - x)
console.log(arr) //[6, 5, 4, 3, 2]

3. 数组合并

concat

let arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]
console.log(arr1.concat(arr2, 7, 8, 9))//[1,2,3,4,5,6,7,8,9]

4. 数组迭代方法

every, some, filter, map, forEach, reduce

let arr = [10, 11, 12, 13]
let res = arr.every((item) => {
return item > 0
})
console.log(res) //true
let arr = [10, 11, 12, 13]
let res = arr.some((item) => item > 12)
console.log(res) //true
let arr = [10, 11, 12, 13]
let res = arr.filter((item) => item > 12)
console.log(res) //[13]
let arr = [10, 11, 12, 13]
let res = arr.map((item) => item + 'zhf')
console.log(res) //['10zhf', '11zhf', '12zhf', '13zhf']
let arr = [10, 11, 12, 13]
 arr.forEach((item, index) =>{
	 console.log(item, index)
 })
 //10 0
 //11 1
 //12 2
 //13 3
let arr = [10, 11, 12, 13]
let res = arr.reduce((item1, item2) => item1 + item2)
console.log(res) //46