未定义数组索引:_数据结构-数组

数组

在数组末尾插入元素:push

let numbers = [3,4,7,0,1,6]
numbers.push(11,14) //返回数组长度

在数组开头插入元素:unshift

numbers.unshift(11,14) //返回数组长度

手写一个:unshift

思路:先腾出数组里的第一个元素的位置,把所有元素向右移动一位

  1. 循环数组中的元素,从最后一位开始(旧数组的长度就是新数组的最后一个元素位置),将对应的前一个元素(i-1) 的值赋值给 (i),实现了所有元素右移了一位
  2. 最后把要添加的值赋给第一个位置(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

最后一次循环里,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

代码这样写

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
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 类似,将数组作为字符串返回
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值