一、JS数组不是典型的数组

典型数组的特征

JS对象之数组 - 图1

  1. 使用一段连续的内存
  2. 数组中每个元素的类型一样
  3. 通过数字下标访问元素
  4. 随机访问的复杂度是O(1)

JS数组

JS对象之数组 - 图2
JS数组和典型数组相比,不同点有:

  1. 内存不一定是连续的,因为对象在JS中是随机存储的
  2. 元素的数据类型可以不同
  3. 不能通过数字下标访问,而是通过字符串下标
    1. 也就是说数组可以用任何Key
      1. 比如let arr = [1, 2, 3]
      2. arr[‘xxx’] = 1

新建数组

同声明对象的方法类似,只是把”{}”改成”[]”

  • let arr = [1, 2, 3] 【最常用】
  • let arr = new Array(1, 2, 3)

转化数组

split()

image.png

Array.from()

“从什么地方得到一个数组”
尝试把不是数组的东西变成数组
image.png
要求:

  1. 一般为对象、字符串
  2. 有0、1、2、3这样的下标
  3. 有一个length属性

伪数组(原型链有关)

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

常用解决机制——Array from()
image.png
image.png
前者为数组,原型链有三个对象,分别是自身、数组、根对象
后者为伪数组,原型链只有两个对象,分别是自身和根对象

合并数组

concat()
把两个数组合并,会返回一个新数组,不会改变原来的数组

截取数组

slice方法的参数是(start, end), 从start开始, 截取到end-1个元素,并且返回一个新数组,不会影响原先的数组
JS对象之数组 - 图7

复制数组

arr5.slice(0):全部截取,常用于复制一个数组
原生JS 只提供浅层拷贝

数组之——增删改查CRUD

查看所有元素

查看数组的所有属性名
按照处理对象的方式来处理数组

  1. 第一种
  2. Object.keys(arr)
  3. 第二种
  4. for(let key in arr){console.log(`${key}:${arr[key]}`)}

foreach

  1. function forEach(arr, fn) {
  2. for(let i = 0; i < arr.length; i++){
  3. fn(arr[i], i, array)
  4. }
  5. }

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() 针对属性值为数字进行排序;默认从小到大排序

  1. arr.sort((a, b) => a.score - b.score) //a>b则a前b后,反之亦然

数组变换

注意:不会改变原数组

map (映射) (n1变n2)

前者与后者一 一映射的关系
JS对象之数组 - 图8
(练题)把数字变成日期:

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

filter (过滤)( n变少)

(练题)挑选出比60高的:

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

reduce(归纳)(n变1)

reduce是数组最厉害的一个api,可一定程度上替代map和filter
image.png
JS对象之数组 - 图10

  1. let arr = [
  2. {'名称': '动物', id: 1, parent: null},
  3. {'名称': '猫', id: 2, parent: 1},
  4. {'名称': '狗', id: 3, parent: 1}
  5. ]
  6. let arr3 = arr.reduce(function (result, item) {
  7. if (item.parent === null) {
  8. result.id = item.id
  9. result['名称'] = item['名称']
  10. } else {
  11. delete item.parent
  12. item.children = null
  13. result.children.push(item)
  14. }
  15. return result
  16. }, {id: null, children: []})
  17. console.dir(arr3)