- 数组是一种特殊的对象
- JS的数组实际上是对象,只不过它的下标是0,1,2,length
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 divList = document.querySelectorAll('div'), divList是一个伪数组
-
伪数组的原型链中并没有数组的原型
- Array.from可以把不是数组的东西变成数组
- arr1.concat(arr2)合并两个数组,得到新的数组
- arr1.slice(1) // 从第二个元素开始
- arr1.slice(0) //全部截取,经常用于复制一个数组
- 注意,JS只提供浅拷贝
增删改查(数组中的元素)
删元素
- 使用delete(不推荐),奇怪的是,数组的长度并没有变
- 改length(不推荐)
推荐方法:
删除头部的元素
- 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) { //适合对象,不适合数组,同样,for...in是来访问对象的
console.log(`${key}:${arr[key]}`)
}
Object.values(arr) //[1,2,3,4,5,"x"]
for(let i=0;i<arr.length;i++) {
console.log(`${i}: ${arr[i]}`)
}
arr.forEach(function(item,index) {
console.log(`${index}: ${item}`)
})
//也可以用forEach/map等原型上的函数
forEach的基本原理
function forEach(array,fn) {
for(let i=0;i<array.length;i++) {
fn(array[i],i,array)
}
}
//forEach用for访问array的每一项
//对每一项调用fn(array[i],i,array)
- for循环和forEach的区别:
- for循环支持break和continue,forEach中没有
- for循环只有块级作用域,forEach有函数作用域
查看单个属性
- arr[0]: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
undefined不是一个对象,不是一个对象就没有toString
- 查找某个元素是否在数组里
arr.indexOf(item) //存在返回索引,否则返回-1
- 使用条件查找元素
arr.find(item=>item%2 === 0) //找第一个偶数
找第一个除以5余数为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()//修改原数组
//反转字符串的方法
var s = 'abcde'
s.split('').reverse().join('')
自定义顺序
arr.sort((a,b)=>a-b)
数组变换
- map:n变n,map会返回一个新的数组,不会改变原数组 对每一个item,把item变成item*item
- filter:n变少
- reduce:n变1
reduce实现item*item
reduce模仿filter
简化
面试题
//数据变换
let arr = [
{名称:'动物',id:1,parent:null},
{名称:'狗',id:2,parent:1},
{名称:'猫',id:3,parent:1}
]
数组变成对象
{
id:1,名称:'动物',children:[
{id:2,名称:'狗',children:null},
{id:3,名称:'猫',children:null},
]
}
//答案
let arr = [
{名称:'动物',id:1,parent:null},
{名称:'狗',id:2,parent:1},
{名称:'猫',id:3,parent:1}
]
console.log(arr)
let arrNew = 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:[]})
console.log(arrNew)
资料来源:饥人谷