数组对象(数组是用对象模拟的)
典型的数组
- 元素的数据类型相同
- 使用连续的内存存储
- 通过数字下标获取元素
但JS的数组不这样
- 元素的数据类型可以不同
- 内存不一定是连续的(对象是随机存储的)
- 不能通过数字下标,而是通过字符串下标
- 这意味着数组可以有任何 key
- 例如:
let arr = [1,2,3]
arr ['xxx'] = 1
创建一个数组
新建
- 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.slice(1) // 从第二个元素开始
- arr1.slice(0) // 全部截取
- 注意,JS只提供浅拷贝
增删改查
删元素(不推荐方法)
let arr = ['a','b','c']
delete arr['0']
arr //[empty,'b','c']
- 直接改length也可以删除元素(不要随意改length)
let arr = [1,2,3,4,5]
arr.length = 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'
查看所有元素
查看所有属性名
let arr = [1,2,3,4,5]; arr.x = 'xxx'
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]}`) // ${} 表示可以插入一个变量
}
- 你要自己让 i 从 0 增长到 length - 1
arr.forEach(function(item,index){
console.log(`${index}: ${item}`)
})
- 也可以用 forEach / map 等原型上的函数
查看单个属性
跟对象一样
- 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) // 找第一个偶数的索引
增加数组中的元素
在尾部加元素
- 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')
修改数组中的元素
反转顺序
自定义顺序
数组变化(不会改变原数组)
map
let arr = [1,2,3,4,5,6]
arr.map(item => item*item)
filter
let arr = [1,2,3,4,5,6]
arr.filter(item => item % 2 === 0 ? true : false)
arr.filter(item => item % 2 === 0) // 等价于上面的
reduce
let arr = [1,2,3,4,5,6]
arr.reduce((sum, item)=> {return sum+item },0)
数据变化(面试题)
let arr = [
{名称:'动物', id: 1, parent: null},
{名称:'狗', id: 2, parent: null},
{名称:'猫', id: 3, parent: null}
]
// 数组变成对象
{
id: 1, 名称: '动物', children: [
{id: 2, 名称: '狗', children: null}
{id: 3, 名称: '猫', children: null}
]
}