JS-8:JS数组

98 阅读3分钟

1 数组

1.1 数组对象

  • 一种特殊的对象;

  • JS其实没有真正的数组,只是用对象模拟数组,数组的下标不是数字,而是字符串;

  • JS的数组一出生就带了 length ;

1.2 JS数组与典型数组的区别

image.png

2 创建数组

2.1 新建数组

let arr = [1,2,3]
let arr = new Array(1,2,3)
let arr = new Array(3)

2.2 字符串转化为数组

let arr = '1,2,3'.split(',')
let arr = '123'.split('')
Array.from('123')
  • Array.from() 可以通过以下方式来创建数组对象:

    • 伪数组对象(拥有一个 length 属性和若干索引属性的任意对象)
    • 可迭代对象(可以获取对象中的元素,如 Map和 Set 等)
    • 属性名代表了数组的索引号,如果没有这个索引号,转出来的数组中对应的元素就为undefined。

image.png

  • 如果对象不带length属性,那么转出来就是空数组:

image.png

  • 对象的属性名不能转换成索引号时。

image.png

  • length与索引号不对应时

image.png

image.png

2.3 伪数组

  • 定义:没有数组共用属性的数组就是伪数组

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

2.4 concat

  1. 合并两个数组,得到新数组;

  2. arr1.concat(arr2)

2.5 slice

  1. arr.slice(1):从第二个元素开始;

  2. arr1.slice(0):全部截取,可复制数组;

  3. 原生 JS 只提供浅拷贝;

  4. slice返回选取的元素,不影响原数组;

3 数组的增删改查

3.1 删除元素

  1. delete
  • let arr = ['a','b','c'] delete arr['0']

image.png

  • 不改变length,生成稀疏数组,稀疏数组是指 索引不连续,数组长度大于元素个数的数组,通俗地说就是 有空隙的数组,稀疏数组没有好处,只有bug,尽量不要用;
  1. 直接改length,不要随便改 length;

image.png

3.2 数组方法删除元素(推荐)

  1. shift 删除头部元素 arr.shift() :arr被修改,并返回被删元素;

image.png

  1. pop 删除尾部元素 arr.pop() arr被修改,并返回被删元素;

image.png

  1. splice 删除中间的元素

image.png

  • arr被修改,并返回被删元素; image.png

3.3 查看数组元素

  1. 查看所有属性名,数组中不要用for in(访问对象),也不要用Object.keys(),会出现不想要的东西;
let arr = [1,2,3,4,5]
arr.x = 'xxx'
Object.keys(arr)
Object.values(arr)
for(let key in arr){
  console.log(`${key}:${arr[key]}`)
}
  1. for、forEach查看数字(字符串)属性名和值(推荐)
let arr =[1,3,5,7,8]
for (let i=0; i< arr.length; i++){
    console.log(`${i}:${arr[i]}`)
    }
arr.forEach(function(item,index){
  console.log(`${index}:${item}`)
})

image.png

  1. 写forEach,forEach可以传三个参数,一般不写第三个参数

image.png

3.5 查看单个属性

  • 索引查看:arr[index]

  • 索引越界:读取任何不存在的下标,都会得到undefined,而undefined不属于对象,所以没有toString;

arr[arr.length]===undefined
arr[-1]===undefined

image.png

3.6 查看单个属性

  • indexOf:查看某个元素是否在数组里 arr.indexOf(item) :存在返回索引,否则返回-1;

  • arr.find:条件查找,返回第一个符合条件的值; arr.find(item=>item%2===0) :找第一个偶数

  • findIndex:条件查找元素的索引,返回第一个符合条件的索引值 arr.findIndex(item=>item%2===0) :找第一个偶数的索引值

3.7 增加数组中的元素

  • push:尾部加元素,修改arr,返回新数组的长度
arr.push(item1,item2,...)
  • unshift:头部加元素,修改arr,返回新数组的长度 arr.unshift(item1,item2,...)

  • splice:在中间加元素,修改arr,返回删掉的元素

arr.splice(index,0,'x') //在index处插入'x'
arr.splice(index,0,'x','y')

3.8 修改数组中的元素

  • reverse:反转顺序,修改原数组; arr.reverse()

  • sort:自定义顺序

image.png

  • 从小到大排,还可以写成: arr.sort((a,b)=>a.score-b.score) :因为a.score大于b.score的话,就会返回正数;

4 数组变换

  • map、filter、reduce都不会修改原数组 image.png

image.png

image.png

  • 数组变成对象

image.png

let arr=[{名称:'动物',id:1,parent:null},{名称:'狗',id:2,parent:1},{名称:'猫',id:3,parent:1}]
arr.reduce((result,item)=>{
    if(item.parent===null){
       result.id=item.id
       result.名称=item.名称
}else{
    result.children.push(item)
    delete item.parent
    item.children=null
}
return result
},{id:null,children:[]})