数组对象
JS 的数组不是典型数组
- 典型的数组
- 元素的数据类型相同
- 使用连续的内存存储
- 通过数字下标获取元素

- 但是 JS 的数组不这样
- 元素的数据类型可以不同
- 内存不一定是连续的(对象是随机存储的)
- 不能通过数字下标,而是通过字符串下标
- 这意味着数组可以有任何 key
- 比如
let arr = [1,2,3]
arr['xxx'] = 1
- 完全合法

创建一个数组
1 2 3
| let arr = [1,2,3] let arr = new Array(1,2,3) let arr = new Attr(3)
|
1 2 3 4 5
| let arr = '1,2,3'.split(',') let arr = '123'.split('') Array.from('123')
|
1 2 3 4 5
| let divList = document.querySelectorAll('div') 可以变成数组 let divArray = Array.from(divList) console.dir(divArray) 这样就变成数组了
|
伪数组的原型链中并没有数组的原型,直接指到了根对象
- 没有
push
或者 pop
等数组共有的属性,那就是伪数组
- 没有数组共用属性的【数组】,就是伪数组
创建一个数组(续)
1 2 3
| arr1.slice(1) arr1.slice(0) 注意,JS 只提供浅拷贝
|
增删改查 数组中的元素
1 2 3 4
| let arr = ['a', 'b', 'c'] delete arr['0'] arr 神奇,数组的长度并没有变
|
1 2
| let arr = [1,2,3,4,5] arr.length = 1
|
1 2 3
| arr.splice(index, 1) arr.splice(index, 1, 'x') arr.splice(index, 1, 'x', 'y')
|
查看所有元素
1 2 3 4
| let arr = [1,2,3,4,5];arr.x='xxx' Object.keys(arr) for(let key in arr){console.log(`${key}:${arr[key]}`)}
|
1 2 3 4
| for(let i = 0; i < arr.length; i ++){ console.log(`${i}: ${arr[i]}`) }
|
- 你要自己让
i
从 0
增长到 length -1
1 2 3 4 5 6 7 8 9
| arr.forEach(function (item, index){ console.log(`${index}: ${item}`) }) arr.forEach((x,y) => { console.log(x+":"+y) })
|
- 也可以用
forEach
/ map
等原型上的函数
forEach 是一个坎
1 2 3 4 5 6 7 8 9 10 11 12
| 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)
- 为什么要传入
array
呢? 不为什么,规定如此。
查看单个属性
1 2
| let arr = [111,222,333] arr[0]
|
1 2
| arr[arr.length] === undefined arr[-1] === undefined
|
1 2 3 4
| for(let i = 0; i<= arr.length; i++){ console.log(arr[i].toString()) } 报错:Cannot read properties of undefined (reading 'toString')
|

查看单个元素(续)
1 2 3 4 5 6
| for(let i = 0; i<arr2.length; i++){ if(arr[i] === 13){ console.log('yes') } }
|
1 2 3
| arr.find(function (x){ return x%5===0 })
|
1
| arr.find(item => item % 2 === 0)
|
1 2 3
| arr.findIndex(function (x){ return x%5===0 })
|
1 2
| arr.findIndex(item => item % 2 === 0)
|
增加数组中的元素
1 2
| arr.push(newItem) arr.push(item1, item2)
|
1 2 3
| arr.unshift(newItem) arr.unshift(item1, item2)
|
1 2 3
| arr.splice(index, 0, 'x')
arr.splice(index, 0, 'x', 'y')
|
修改数字中的元素
1 2 3 4 5 6 7 8 9
| arr.sort(function (a,b){ if(a>b){ return 1 }else if(a===b){ return 0 }else{ return 1 } })
|
1 2
| arr.sort((a,b)=> a-b) 需要详细讲解
|
1 2 3 4 5 6 7 8 9 10 11
| let arr = [ {name:'小明', score:99}, {name:'小红', score: 95}, {name:'大黄', score: 100} ]
arr.sort((a,b) => a.score - b.score)
|
数组变换

数字变换(续)
1 2 3 4
| let arr = [1,2,3,4,5,6] for (let i=0; i<arr.length; i++){ arr[i] = arr[i]*arr[i] }
|
1 2
| let arr = [1,2,3,4,5,6] arr.map(item => item*item)
|
1 2
| arr.filter(item => item %2 ===0?true : false) arr.filter(item => item %2 ===0)
|
1 2 3 4 5 6
| let arr = [1,2,3,4,5,6] let sum = 0 for (let i=0; i<arr.length; i++){ sum += arr[i] } console.log(sum)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| arr.reduce((sum, item)=>{return sum+item} ,0)
arr.reduce((result,item) => {return result.concat(item*item)}, [])
arr.reduce((result, item)=>{ if(item %2 === 1){ return result }else{ return result.concat(item) } },[])
arr.reduce((result, item)=> item % 2 ===1 ? result : result.concat(item) ,[])
arr.reduce((result, item)=> result.concat(item % 2 === 1 ? [] : item) ,[])
|
参数 |
描述 |
total |
必需。初始值, 或者计算结束后的返回值。 |
currentValue |
必需。当前元素 |
currentIndex |
可选。当前元素的索引 |
arr |
可选。当前元素所属的数组对象。 |
题目
面试题
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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} ] }
|
答案
1 2 3 4 5 6 7 8 9 10 11
| 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: []})
|
版权声明: 资料来源:饥人谷。任何组织或个人未经许可,禁止转载