JS数组

111 阅读3分钟

1. 数组对象

JS没有真正的数组,只是用对象模拟数组

  • 元素的数据类型可以不同
  • 内存不一定是连续的(对象是随机存储的)
  • 不能通过数字下标获取元素,是通过字符串下标获取的,于此数组可以有任何key

典型数组

  • 元素的数据类型相同
  • 使用连续的内存存储
  • 通过数字下标获取元素

2. 创建数组

  • 新建
let arr = [1,2,3]
let arr = new Array(1,2,3)
let arr = new Array(3)
  • 转化
let arr = '1,2,3'.split(',')
let arr = '123'.split('')
Array.from('123')
  • 伪数组
let divList = document.querySelectorAll('div')

没有数组公共属性的数组就是伪数组,伪数组的原型链中没有数组的原型

  • 合并数组
arr1.concat(arr2)
  • 截取数组
arr.slice(1) // 从第2个元素开始
arr.slice(0) // 全部截取

注意:JS只提供浅拷贝

3. 增删改查(元素)

3.1 删元素

删除头部的元素

arr.shift() // arr被修改,并返回被删元素

删除尾部的元素

arr.pop() // arr被修改,并返回被删元素

删除中间的元素

arr.splice(index,1) // 删除index的第一个元素
arr.splice(index,1,x) // 删除index的第一个元素,并在删除的位置添加'x'
arr.splice(index,1,x,y) // 删除index的第一个元素,并在删除的位置添加'x','y'

3.2 查看属性

  • 查看所有数字(字符串)属性名和值
for(let i = 0; i < arr.length; i++){
console.log(`${i}: ${arr[i]}`)
}

让i从0增长到length-1

arr.forEach(function(item, index){
console.log(`${index}: ${item}`)
})
  • 查看单个属性
for(let i = 0; i<= arr.length; i++){
console.log(arr[i].toString())
}
// 报错:Cannot read  property 'toString' of undefined,表示读取了undefined的toString属性

查找某个元素是否在数组里

arr.indexOf(item) // 存在返回索引,否则返回-1

使用条件查找元素

arr.find(item=>item%2===0) // 找第一个偶数

使用条件查找元素的索引

arr.findIndex(item=>item%2===0) // 找第一个偶数的索引

3.3 增加数组的元素

  • 在尾部加元素
arr.push(newItem) // 修改arr,返回新长度
arr.push(item1,item2) // 修改arr,返回新长度
  • 在头部加元素
arr.unshift(newItem) // 修改arr,返回新长度
arr.unshift(item1,item2) // 修改arr,返回新长度
  • 在中间加元素
arr.splice(index,0,x) // 在index处添加'x'
arr.splice(index,0,x,y) // 在index处添加'x','y'

3.4 修改数组的元素

  • 反转顺序
arr.reverse() // 修改原数组
  • 自定义顺序
arr.sort((a,b)=>a-b)    

4. 数组变换

4.1 map(n变n)

let arr = [0,1,2,2,3,3,3,4,4,4,4,6]
let arr2 = arr.map((i)=>{
  const hash = {0:'周日',1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六'}
  return hash[i]
})
console.log(arr2) // ['周日', '周一', '周二', '周二', '周三', '周三', '周三', '周三', '周四', '周四', '周四', '周四' ]

4.2 filter(n变少)

let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let scores2 = scores.filter(n => n>= 60)
console.log(scores2) //  [95,91,82,72,85,67,66, 91]

4.3 reduce(n变1)

let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let sum = scores.reduce((sum, n)=>{
  return n%2===0?sum:sum+n
},0)
console.log(sum) // 奇数之和:598 

标注:以上内容部分参考饥人谷,侵删。