数组
在数组末尾插入元素:push
let numbers = [3,4,7,0,1,6]
numbers.push(11,14) //返回数组长度
在数组开头插入元素:unshift
numbers.unshift(11,14) //返回数组长度
手写一个:unshift
思路:先腾出数组里的第一个元素的位置,把所有元素向右移动一位
- 循环数组中的元素,从最后一位开始(旧数组的长度就是新数组的最后一个元素位置),将对应的前一个元素(i-1) 的值赋值给 (i),实现了所有元素右移了一位
- 最后把要添加的值赋给第一个位置(0)上
Array.prototype.insertFirstPosition = function(value) {
for(let i = this.length; i >= 0; i--) {
this[i] = this[i-1]
}
this[0] = value
}
numbers.insertFirstPosition(-1)
从数组末尾删除元素:pop
let numbers = [3,4,7,0,1,6]
numbers.pop() //返回被删除的元素
从数组开头删除元素:shift
let numbers = [3,4,7,0,1,6]
numbers.shift() //返回被删除的元素
手写一个:shift
思路:所有元素左移一位,覆盖掉第一个元素
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i+1]
}
问题是,数组的长度依然是6,意味着数组中有一个元素的值是 undefined
![855020db82015a512ec9a4b490c90630.png](https://img-blog.csdnimg.cn/img_convert/855020db82015a512ec9a4b490c90630.png)
最后一次循环里,i+1 引用了数组里还未初始化的一个位置,可以看出以上只是把数组第一位的值用第二位覆盖了,并没有删除元素(因为数组的长度和之前是一样的,并且还多了一个未定义的元素)
要从数组中移除这个值,可以利用刚才的逻辑,定义函数 removeFirstPositon ,但是要真正的从数组中移除这个元素,我们需要创建一个新的数组,将所有不是 undefined 的值从原数组赋值到新数组中,并且将这个新数组赋值给我们的数组
let numbers = [3,4,7,0,1,6]
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() //[4,7,0,1,6]
在任意位置添加或删除元素:splice
删除
let numbers = [3,4,7,0,1,6]
//删除从数组索引1开始的3个元素
numbers.splice(1,3) //返回被删除的元素 [4,7,0]
添加
let numbers = [3,4,7,0,1,6]
//从索引1的元素前面添加(0表示删除元素的个数,此处为0)2和9(第三个参数往后为要添加的元素)
numbers.splice(1, 0, 2, 9) //[3, 2, 9, 4, 7, 0, 1, 6]
二维数组(矩阵)
如何理解呢,举个 ,要记录数天内每小时的气温
一维数组这样存
let averageTemDay1 = [72, 75, 79, 79, 81, 81]
let averageTemDay2 = [81, 79, 75, 75, 73, 72]
let ...
然而,这不是最好的方法,还可以做的更好
使用矩阵(二维数组,数组的数组)来存,行保存每天的数据,列对应小时级别的数据(不同时段的气温)
![25d9304ff041e51fea5ed28158d95e68.png](https://img-blog.csdnimg.cn/img_convert/25d9304ff041e51fea5ed28158d95e68.png)
代码这样写
let averageTemp = []
// day 1
averageTemp[0] = [72, 75, 79, 79, 81, 81] // day 1 中存贮小时级别的数据
averageTemp[1] = [81, 79, 75, 75, 73, 72]
还可以这样写
let averageTemp = []
// day 1
averageTemp[0] = [];
averageTemp[0][0] = 72;
averageTemp[0][1] = 75;
averageTemp[0][2] = 79;
averageTemp[0][3] = 79;
averageTemp[0][4] = 81;
averageTemp[0][5] = 81;
// day 2
averageTemp[1] = [];
averageTemp[1][0] = 81;
averageTemp[1][1] = 79;
averageTemp[1][2] = 75;
averageTemp[1][3] = 75;
averageTemp[1][4] = 73;
averageTemp[1][5] = 73;
迭代二维数组的元素
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])
}
}
}
多维数组
创建一个 3 × 3 × 3 的矩阵,每一格里包含矩阵的 i(行),j(列)及 z(深度)之和
![c0f69919613d2f3e7349a5690d6cbe28.png](https://img-blog.csdnimg.cn/img_convert/c0f69919613d2f3e7349a5690d6cbe28.png)
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
}
}
}
循环迭代每个维度来访问所有的格子
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])
}
}
}
其他常用方法,具体参考 MDN
- concat 连接 2 个或更多数组,并返回结果
- every 对数组中的每个元素运行给定函数,如果该函数对每个元素都返回 true,则返回 true
- filter 对数组中的每个元素运行给定函数,返回该函数会返回 true 的元素组成的数组
- forEach 对数组中的每个元素运行给定函数。这个方法没有返回值
- join 将所有的数组元素连接成一个字符串
- indexOf 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
- lastIndexOf 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
- map 对数组中的每个元素运行给定函数,返回每次函数调用的结果组成的数组
- reverse 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个
- slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回
- some 对数组中的每个元素运行给定函数,如果任一元素返回 true,则返回 true
- sort 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
- toString 将数组作为字符串返回
- valueOf 和 toString 类似,将数组作为字符串返回