一、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)
四、数组变换
- map() 请使用 arr.map 把 0 变成'周日',把 1 变成'周一',以此类推 代码链接:js.jirengu.com/wefud/4/edi…
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