学习JavaScript数据结构与算法 第三章
三,数组
3.1 为什用数组
- 方便存储和访问同类型数据
- 快速查找,排序和过滤数据
- 节省代码
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 迭代器函数
- 用 every 方法迭代
- 用 some 方法迭代
- 用 forEach 方法迭代
- 使用 map 和 filter 方法
- 使用 reduce 方法
3.7.3 ECMAScript6 和数组的新功能
- 使用 for...of 循环迭代
- 使用 @@iterator 对象
- 数组的 entries,keys 和 values 方法
- 使用 Array.from 方法
- 使用 Array.of 方法
- 使用 fill 方法
- 使用 copyWithin 方法
3.7.4 排序元素
-
reverse
方法 -
sort
方法- 自定义排序
- 字符串排序
3.7.5 搜索
搜索有两个方法:indexOf
方法返回与参数匹配的第一个元素的索引;lastIndexOf
返回与参数匹配的最后一个元素的索引
- ES6 ---
find
和findIndex
方法 - ES& --- 使用
includes
方法
3.7.6 输出数组为字符串
现在,我们学习最后两个方法:toString
和join
。
3.8 类型数组
与 C 和 Java 等其他语言不同,JavaScript 数组不是强类型的,因此它可以存储任意类型的数据。
类型数组则用于存储单一类型的数据。它的语法是 let myArray = new TypedArray (length),其中 TypedArray 需替换为下表所列之一。
类型数组 | 数据类型 |
---|---|
Int8Array | 8 位二进制补码整数 |
... | ... |