JS数组对象

一、数组的基本概念

JS的数组不是典型数组典型的数组,只是用对象 key 和 value 模拟数组

典型的数组:
  • 元素的数据类型相同
  • 使用连续的内存存储
  • 通过数字下标获取元素
JS的数组
  • 元素的数据类型可以不同(数字、字符串、地址)
  • 内存不一定是连续的(对象是随机存储的)
  • 不能通过数字下标,而是通过字符串下标
  • 这意味着数组可以有任何key
    比如let arr=[1,2,3]
    arr['xxx']=1,就会有一个下标围为 ‘xxx’的key值为1
定义一个数组:
  • let arr = [1,2,3]
  • let arr = new Array [1,2,3] 元素为123
  • let arr = new Array(3)长度为3
转化
  • 通过字符串创建数组:
    let arr = '1,2,3'
    arr.split(',') 得到[1,2,3]
    split 是用来括号中的东西来分割字符串
  • let arr = '123'.split('') 如果没有,用空字符串分割也得到[1,2,3]
  • Array.form('123')
    Array.from从哪得到一个数组 把不是数组的东西尝试变成数组
    只是在某种条件(length和下标)下才能,如:字符串可以,数组、数字、布尔不可以
    对象在有length属性时才可以,会根据length创建数组(三个元素length2 会自动删除一个)
伪数组

伪数组的原型链中没有数组的原型

  • 真数组:let arr = [1,2,3]
    arr.-proto- === Array.prototype
  • 伪数组:let arr1 = [0:'1',1:'2',2:'3',length:'3']
    arr.-proto- === Object.prototype

伪数组没用 见到变成真即可

  • 比如 let divList = doucment.querySelectorALL('div')
  • 获取所有的div 得到的就是一个伪数组,querySelector只是帮你创建对象,push、pop等都不能用
  • 变为真:let divArray = Array.form(divList)
合并、截取数组

合并:
arr1.concat(arr2):合并两个数组得到新数组,不会改变原来数组。
截取:
arr1.slice(1)//从第二个元素开始截取
arr1.slice(0)//全部(经常用于复制数组)
注意:JS只提供浅拷贝

二、对象中元素增删改查

1、删除

用对象的删除方法(不靠谱)
let arr = 【‘a’ 'b' 'c'】
delete arr['0']
arr // [empty,'b','c']
数组长度没变化
这种只有长度但是没有对应的下标的数组叫做稀疏数组(没啥用的一个东西)。


如果我修改数组的length(不靠谱)
let arr = 【‘a’ 'b' 'c'】
arr.length = 1得到arr = ['a']

对象的删除元素方法

  • 删除头部元素:arr.shift()
    arr被修改返回被删除元素
  • 删除头部元素:arr.shift()
    arr被修改返回被删除元素
  • 删除中间元素:
    arr.splice(index,1,'x','y')
    从下标为index的元素开始删除,1就是删除一个,并在删除位置添加'x','y'.

2、查看

用对象方法查看属性名和值(不靠谱)

  • let arr = [1,2,3,4,5]; arr.x = 'xxx'
    Object.keys(arr) ["0"."1","2","3","4","x"]
    Object.values(arr)["1","2","3","4","5","xxx"]
  • for in 查看
    for(let i in arr){console.log(i)}

用循环

  • for(let i = 0;i<arr.length;i++){console.log(${i}:${arr[i]})},这样就不会把x打印出来(x不算length里)
    模板字符串用法如上 记住
  • forEach接受一个函数 函数可以遍历每一项(数组提供的方法,这是一个回调)
    arr.forEach(function(item,index){
    console.log(${index}:${item})}
    })

forEach原理
遍历这个数组每一次都掉用这个函数

forEach

用for循环和foreach 的区别

  • 大部分情况下通用 只有for循环里有 break 和continue 的时候 forEach 不支持必须走到尾
  • for循环是关键字 不是函数 没有函数作用域 只有块级作用域
  • foreach是一个函数 所以它是一个函数作用域

查看单个属性

  • 同对象
    let arr = [111,222,333] arr[0]
  • 索引越界(不存在的下标)
    arr[arr.length] === undefined
    arr[-1]=== undefined
    Cannot read property 'toString' of undefined
    读取了undefined的toString属性
  • 查找某个元素是否在数组中
    arr.indexOf(item)存在返回索引,否则返回-1
  • 使用条件查找元素 find
    arr.find(item => item%2===0)//找到第一个偶数
    只要某一次返回true马上停止并返回元素
  • 使用条件查找元素的所用
    arr.findIndex(item => item%2===0)//找到第一个偶数索引

3、增加数组中的元素

在尾部添加元素
arr.push(newItem)
arr.push(item1,item2)//修改arr,返回新长度

在头部添加元素
arr.unshift(newItem)
arr.unshift(item1,item2)//修改arr,返回新长度

在头部添加元素
arr.splice(index,0,'x','y')在index处插入'x'

3、修改数组中的元素

arr.splice(index,1,'x')把index改为'x'
arr[index] = x

修改顺序

反转顺序

arr.reverse()//修改原数组
经典面试题 一个字符串如何反转顺序
join() 方法用于把数组中的所有元素放入一个字符串。

反转字符串

自定义顺序

sort方法:从小到大


sort

sort方法:我想自己定义谁大 比如排名,不想用sort再reverse。我可以改变1和-1来控制


自定义

对象数组排序:
let arr[{name:'小明',score:99},{name:'小fg',score:55},{name:'小s',score:77} ]
排序
简化

三、数组转换(map、filter、reduce)

数组变换
  • map n变n
  • filtern变少
  • reduce n变1
    这三个都是生成新数组不改变原来的

arr.map(一一映射)

复杂写法

map

使用map写好映射关系即可
map

arr.filter

filter

arr.reduce

0是默认的初始值 第一次 0 和1 加起来 return 成为新的初始值 然后继续


reduce

arr.reduce替换map

reduce

arr.reduce替换filter

reduce
简写
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容