数组对象 一种特殊的对象
JS其实没有真正的数组,只是用对象模拟数组
- 元素的数据类型可以不同
- 内存不一定是连续的
- 不能通过数字下标,而是通过字符串下标
- 数组可以有任意的key
let arr = [1,2,3]
arr['name'] = 'maike'
Object.keys(arr)
创建一个数组
新建
let arr = [1,2,3]
let arr = new Array(1,2,3)
let arr = new Array(3)
let arr1 = [1,2]
let arr2 = [3,4]
arr1.concat(arr2)
let arr = [1,2,3,4,5]
arr.slice(2)
let arr2 = arr.slice(0)
转化
let arr = '1,2,3'.split(',')
let arr = '123'.split('')
Array.from('123')
伪数组
let div = document.querySelectorAll('div')
div.__proto__ === Array.prototype
数组的增删改查
和对象一样
let arr = [1,2,3]
delete arr['0']
arr
改变数组的length
let arr = [1,2,3]
arr.length = 1
arr
删除头部的元素
let arr = [1,2,3,4]
arr.shift()
arr
删除尾部的元素
let pop = [1,2,3,4]
arr.pop()
arr
删除中间的元素
let arr = [1,2,3,4]
arr.splice(1,1)
arr
arr.splice(0,1,'hi')
arr
arr.splice(0,1,'wqeqweqw',12312321)
arr
遍历数组
查看所有元素名
let arr = [1,2,3,4]
Object.keys(arr)
for(key in arr){console.log(key + ':' + arr[key])}
查看数字属性名和属性值
let arr = [1,2,3,4]
for(let i = 0;i<arr.length;i++){
console.log(i + ':' + arr[i])
}
arr.forEach(function(key,value){
console.log(key,value)
})
function forEach(array,fn){
for(let i=0;i<array.length;i++){
fn(i,array[i])
}
}
forEach(arr,function(key,value){
console.log(key,value)
})
查看单个属性
let arr = [1,2,3]
arr[0]
arr[-1]
arr[arr.length]
查看一个元素是否存在数组里
let arr = [1,2,3,4]
arr.indexOf(1)
arr.indexOf(10)
arr.find(function(ele){
return ele % 2 === 1
})
arr.findIndex(function(ele){
return ele % 2 === 1
})
增加数组中的元素
let arr = [1,2,3]
arr.push(4)
arr
arr.push(5,6,7,8)
arr
let arr2 = [1,2,3]
arr2.unshift(0)
arr2
arr2.unshift(-1,-2)
arr2
arr2.splice(3,0,0.1,0.2)
arr2
修改数组中的元素
let arr = [1,2,3]
arr[0] = '1212'
arr.splice(0,1,'asdas')
arr.reverse()
let name = 'neb'
name.split('').reverse().join('')
let reArr = [2,5,1,3,4]
reArr.sort()
reArr.sort(function(a,b){
if(a>b){return -1}
else if(a===b){return 0}
else{return 1}
})
let childList = [
{name:'mike',age:10},
{name:'ben',age:8},
{name:'lily',age:17}
]
childList.sort(function(a,b){
if(a.age>b.age){return -1}
else if(a.age===b.age){return 0}
else{return 1}
})
childList.sort((a,b)=>a-b)
数组变换 map,filter,reduce
- map n变n 创建一个新数组,其结果是该数组中的每个元素都调用一次提供的函数后的返回值。
let arr = [1,2,3]
arr.map(value=>value*value)
function copyMap(arr,fn){
let tempList = []
for(let i = 0;i<arr.length;i++){
tempList.push(fn(arr[i],i,arr))
}
return tempList
}
let a = copyMap([1,2,3],(value,key)=>{
return value * value
})
console.log(a)
- filter n变少 创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
let arr = [1,2,3,4,5,6]
arr.filter(item => item%2===0)
function copyFilter(arr,fn){
let tempList = []
for(let i = 0;i<arr.length;i++){
if(fn(arr[i],i,arr)){
tempList.push(arr[i])
}
}
return tempList
}
let a = copyFilter([1,2,3],(value,key)=>{
return value % 2 === 0
})
console.log(a)
- reduce n变1 对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。reduce可替代map和filter
let arr = [1,2,3,4,5]
arr.reduce((sum,item)=>sum+item,0)
arr.reduce((arr,item)=>{
return arr.concat(item*item)
},[])
let arr2 = [1,2,3,4,5,6]
arr2.reduce((result,item)=>result.concat(item%2===0?item:[]),[])
常见面试题
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}
]
}
arr.reduce((result, item) => {
if(!result.children){
result.children = []
}
if (item.parent === null) {
result.id = item.id
result.名称 = item.名称
} else {
delete item.parent
item.children = null
result.children.push(item)
}
return result
}, {})