一、JS数组不是典型的数组
典型数组的特征
- 使用一段连续的内存
- 数组中每个元素的类型一样
- 通过数字下标访问元素
- 随机访问的复杂度是O(1)
JS数组
JS数组和典型数组相比,不同点有:
- 内存不一定是连续的,因为对象在JS中是随机存储的
- 元素的数据类型可以不同
- 不能通过数字下标访问,而是通过字符串下标
- 也就是说数组可以用任何Key
- 比如let arr = [1, 2, 3]
- arr[‘xxx’] = 1
- 也就是说数组可以用任何Key
新建数组
同声明对象的方法类似,只是把”{}”改成”[]”
- let arr = [1, 2, 3] 【最常用】
- let arr = new Array(1, 2, 3)
转化数组
split()
Array.from()
“从什么地方得到一个数组”
尝试把不是数组的东西变成数组
要求:
- 一般为对象、字符串
- 有0、1、2、3这样的下标
- 有一个length属性
伪数组(原型链有关)
没有数组共有属性的[数组],就是伪数组
伪数组的原型链中没有数组的原型
常用解决机制——Array from()
前者为数组,原型链有三个对象,分别是自身、数组、根对象
后者为伪数组,原型链只有两个对象,分别是自身和根对象
合并数组
concat()
把两个数组合并,会返回一个新数组,不会改变原来的数组
截取数组
slice方法的参数是(start, end), 从start开始, 截取到end-1个元素,并且返回一个新数组,不会影响原先的数组
复制数组
arr5.slice(0):全部截取,常用于复制一个数组
原生JS 只提供浅层拷贝
数组之——增删改查CRUD
查
查看所有元素
查看数组的所有属性名
按照处理对象的方式来处理数组
第一种
Object.keys(arr)
第二种
for(let key in arr){console.log(`${key}:${arr[key]}`)}
foreach
function forEach(arr, fn) {
for(let i = 0; i < arr.length; i++){
fn(arr[i], i, array)
}
}
foreach的本质就是用for循环访问array的每一项,对每一项调用fn(arr[i], i, array)
查看单个元素
- arr[0]
- arr.indexOf(item) 查找某个元素在不在数组里
- 用find函数,使用条件查找元素
- arr.find(item=>item%2 === 0) 查找第一个偶数
- 使用条件查找元素索引
- arr.findIndex(item=>item%2 === 0) 查找第一个偶数的索引
增&改
在尾部增加
arr.push(newitem1) 修改arr, 返回新长度
arr.push(item1, item2) 修改arr, 返回新长度
在头部增加元素
arr.unshift(newitem1) 修改arr, 返回新长度
arr.unshift(item1, item2) 修改arr 返回新长度
在中间增加元素
arr.splice(index, 0, ‘x’) // 在Index那里插入x
arr.splice(index, 0, ‘x’, ‘y’) // 在Index那里插入x,y
删
删除头部的元素
arr.shift():arr 被修改,并返回被删元素
删除尾部的元素
arr.pop():arr 被修改,并返回被删元素
删除中间的元素
arr.splice(index, 2, ‘x’) :删除从Index位置开始的2个元素,并添加’x’
数组排序
sort() 针对属性值为数字进行排序;默认从小到大排序
arr.sort((a, b) => a.score - b.score) //a>b则a前b后,反之亦然
数组变换
map (映射) (n1变n2)
前者与后者一 一映射的关系
(练题)把数字变成日期:
let arr = [0,1,2,2,3,3,3,4,4,4,4,6]
let arr2 = arr.map((i)=>{
return {0:'周日',1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六'}[i]
})
console.log(arr2)
filter (过滤)( n变少)
(练题)挑选出比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(归纳)(n变1)
reduce是数组最厉害的一个api,可一定程度上替代map和filter
let arr = [
{'名称': '动物', id: 1, parent: null},
{'名称': '猫', id: 2, parent: 1},
{'名称': '狗', id: 3, parent: 1}
]
let arr3 = arr.reduce(function (result, item) {
if (item.parent === null) {
result.id = item.id
result['名称'] = item['名称']
} else {
delete item.parent
item.children = null
result.children.push(item)
}
return result
}, {id: null, children: []})
console.dir(arr3)