学习JavaScript数据结构与算法 第三章

三槐 / 2023-05-07 / 原文

三,数组

3.1 为什用数组

  1. 方便存储和访问同类型数据
  2. 快速查找,排序和过滤数据
  3. 节省代码

3.2 创建和初始化数组

let arr = []

访问元素和迭代数组

const fibonacci = []
fibonacci[0] = 1   // 第1项 下标为0
fibonacci[1] = 1

for (let i = 2; i < 20; i++) {
  fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]
}

console.log(fibonacci)

3.3 添加元素

3.3.1 在数组末尾添加元素

如果想要给数组添加一个元素(比如 10),只要把值赋给数组中最后一个空位上的元素即可。

numbers[numbers.length] = 10

另外,还有一个push方法,能把元素添加到数组的末尾。通过 push 方法,我们能添加任意个元素。

numbers.push(11)
numbers.push(12,13)

3.3.2 在数组开头插入元素

let numbers = [0, 1, 2, 3, 4, 5]

Array.prototype.insertForstPosition = function (value) {
  for (let i = this.length; i >= 0; i++) {
    this[i] = this[i - 1]
  }
  this[0] = value
}

numbers.insertForstPosition(-1)
console.log(numbers)

在 JavaScript 里,数组有一个方法叫 unshift, 可以直接在把数值插入数组的开头。

numbers.unshfit(-2)
number.unshfit(-4,-3)

3.4 删除元素

3.4.1 从数组末尾删除元素

要删除数组里靠后的元素,可以用 pop 方法。

numbers.pop()

3.4.2 从数组开头删除元素

Array.prototype.reIndex = function (myArray) {
  const newArray = []
  for (let i = 0; i < myArray.length; i++) {
    if (myArray[i] !== undefined) {
      newArray.push(myArray[i])
    }
  }
  return newArray
}

// 手动移除第一个元素并重新排序
Array.prototype.removeFirstPosition = function () {
  for (let i = 0; i < this.length; i++) {
    this[i] = this[i + 1]
  }
  return this.reIndex(this)
}

numbers = numbers.removeFirstPosition()
console.log(numbers)

使用 shift 方法:要删除数组的第一个元素,可以用 shift 方法实现。

numbers.shift()

3.5 在任意位置添加和删除元素

我们可以使用 splice 方法,简单地通过指定位置 / 索引,就可以删除相应位置上指定数量的元素。

numbers.splice(5,3)
numbers.splice(5,0,2,3,4)

splice 方法接收的第一个参数,表示想要删除或插入的元素的索引值。第二个参数是删除元素的个数第三个参数往后,就是要添加到数组里的值。

3.6 二维数组和多维数组

我们可以使用矩阵(二维数组,或数组的数组)来存储这些信息。

JavaScript 只支持一维数组,并不支持矩阵。但是,我们可以像上面的代码一样,用数组套数组,实现矩阵或任一多维数组。

3.6.1 迭代二维数组的元素

let matrix = [[1, 2, 3], [11, 22, 33], [111, 222, 333]]

console.log(matrix)

function printMatrix(myMatrix) {
  for (let i = 0; i < myMatrix.length; i++) {
    for (let j = 0; j < myMatrix[i].length; j++) {
      console.log(myMatrix[i][j])
    }
  }
}

// printMatrix(matrix)

3.6.2 多维数组

const matrix3x3x3 = []

for (let i = 0; i < 3; i++) {
  matrix3x3x3[i] = []
  for (let j = 0; j < 3; j++) {
    matrix3x3x3[i][j] = []
    for (let z = 0; z < 3; z++) {
      matrix3x3x3[i][j][z] = i + j + z
    }
  }
}


// console.log(matrix3x3x3)

// for (let i = 0; i < matrix3x3x3.length; i++) {
//   for (let j = 0; j < matrix3x3x3[i].length; j++) {
//     for (let z = 0; z < matrix3x3x3[i][j].length; z++) {
//       console.log(matrix3x3x3[i][j][z])
//     }
//   }
// }

3.7 JavaScript 的数组方法参考

3.7.1 数组合并

concat方法

3.7.2 迭代器函数

  1. 用 every 方法迭代
  2. 用 some 方法迭代
  3. 用 forEach 方法迭代
  4. 使用 map 和 filter 方法
  5. 使用 reduce 方法

3.7.3 ECMAScript6 和数组的新功能

  1. 使用 for...of 循环迭代
  2. 使用 @@iterator 对象
  3. 数组的 entries,keys 和 values 方法
  4. 使用 Array.from 方法
  5. 使用 Array.of 方法
  6. 使用 fill 方法
  7. 使用 copyWithin 方法

3.7.4 排序元素

  • reverse方法

  • sort方法

    1. 自定义排序
    2. 字符串排序

3.7.5 搜索

搜索有两个方法:indexOf方法返回与参数匹配的第一个元素的索引;lastIndexOf返回与参数匹配的最后一个元素的索引

  1. ES6 --- findfindIndex 方法
  2. ES& --- 使用includes方法

3.7.6 输出数组为字符串

现在,我们学习最后两个方法:toStringjoin

3.8 类型数组

与 C 和 Java 等其他语言不同,JavaScript 数组不是强类型的,因此它可以存储任意类型的数据。

类型数组则用于存储单一类型的数据。它的语法是 let myArray = new TypedArray (length),其中 TypedArray 需替换为下表所列之一。

类型数组 数据类型
Int8Array 8 位二进制补码整数
... ...