JavaScript 数组

189 阅读2分钟

数组对象(数组是用对象模拟的)

典型的数组

  • 元素的数据类型相同
  • 使用连续的内存存储
  • 通过数字下标获取元素

但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.concat(arr2)

截取一个数组的一部分

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

修改数组中的元素

反转顺序

  • arr.reverse() // 修改原数组

自定义顺序

  • arr.sort((a,b)=>a-b)

数组变化(不会改变原数组)

map

  • n 变 n
    let arr = [1,2,3,4,5,6]
    arr.map(item => item*item)

filter

  • n 变少
    let arr = [1,2,3,4,5,6]
    arr.filter(item => item % 2 === 0 ? true : false)
    arr.filter(item => item % 2 === 0) // 等价于上面的

reduce

  • n 变 1
    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}
        ]
    }