JS 数组

215 阅读3分钟

一、JS数组的本质

JS数组是一种特殊的对象,只适用对象来模拟数组

JS数组和典型数组的区别

典型数组JS数组
元素类型相同元素的数据类型可以不同
使用连续的内存内存不一定是连续的(因为对象是随机存储的)
通过数字获取下标不能通过数字下标,而是通过字符串下标(意味着JS的数组可以有任何key)

二、创建一个数组

1. 新建

let arr = [1,2,3] // 字面量形式创建
let arr = new Array(1,2,3) // 构造函数形式创建
let arr = new Array(3) // 声明数组长度

2. 转化

let arr = '1,2,3'.split(',')
let arr = '1,2,3'.split('')
Array.from('1,2,3')

3. 伪数组

let divList = document.querySeletorAll('div')

伪数组的原型链中并没有数组的原型

4. 合并

arr1.concat(arr2)

5. 截取

arr1.slice(1)// 从第二个元素截取
arr2.slice(0)// 全部截取,可用于数组复制

JS只提供浅拷贝

三、增删改查

1. 删

  • 和对象一样
let arr = ['a','b','c']
delete arr['0']
console.log(arr)//[empty,'b','c'] // 数组的长度没有变,这种数组即稀疏数组 
  • 直接更改对象长度(不建议)
let arr = [1,2,3,4,5]
arr.length = 1;
console.log(arr) // [1]
  • 删除头部
arr.shift() //arr 被修改,并返回被删的元素
  • 删除尾部
arr.pop() // arr 被修改,并返回被删的元素
  • 删除中间
arr.splice(index,1) // 删除index的第一个元素
arr.splice(index,1,'x') // 并在该位置添加 'x'
arr.splice(index,1,'x','y') // 并在该位置添加 'x','y'

2. 查

  • 查看所有属性名
let arr = [1,2,3,4,5]
arr.x = 'x'
Object.keys(arr)
for(let key in arr){
    console.log(`${key}:${arr[key]}`)
}
  • 查看数字(字符串)属性名和值
for(let i = 0; i < arr.length; i++){
    console.log(`${i}:${arr[i]}`)
}
// 或使用forEach
function forEach(array, fn){
    for(let i = 0; i<array.length; i++){
        fn(array[i],i,array)
    }
}
  • 查看单个属性
// 和对象一样
let arr = [111,222,333]
arr[0]

// 索引越界
arr[arr.length]===undefined
arr[-1] === undefined

// 举例
for(let i = 0;i<arr.length;i++){
    console.log(arr[i].toString())
}
// 报错:Cannot read property 'toString' of undefined

// 查找某个元素是否在数组里
arr.indexOf(item) // 存在返回索引,否则返回-1

// 使用条件查找元素
arr.find(item => item%2 === 0) // 找第一个偶数

// 使用条件查找元素的索引
arr.findIndex(item => item % 2 === 0) // 找到一个偶数的索引

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')

4. 改

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

四、数组变换

bh.png

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)
  • filter() 找出所有大于 60 分的成绩
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]
  • reduce() 算出所有奇数之和
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