1.数组是一个特殊的对象
js其实没有数组,用对象模拟数组
典型的数组
- 元素的数据类型相同
- 使用连续的内存存储
- 通过数字下标获取元素
JS的数组
- 元素的数据类型可以不同
- 不一定是连续内存,因为js数组里面可以放对象
- 通过字符串下标获取元素(JS的下标都是字符串,虽然显示数字,但是会自动转换为字符串)
2.创建一个数组
1.新建
(1)let arr = [1 , 2 , 3];
(2)let arr = new Array(1 , 2 , 3);
(3)let arr = new Array(3); new Array里面只有一个元素,就是创建了一个length为3,都是空元素的数组
2.转化
(1)split
let arr = ‘1,2,3’;
arr.split(',');
可以直接写成
let arr = ‘1,2,3’.split(',');
用什么分割,原字符串有, ,就用,分割
let arr = ‘123’.split('');
原字符串是空格,就用空字符串分割
(2)from
字面意思:从什么地方得到一个数组
尝试把什么东西变成数组
Array.from('1,2,3');直接把字符串变为数组
Array.from({1:'a',2:'b',3:'c'.length:3};变对象的时候要有length和数字下标,不然变不了
伪数组:不是通过Array构造出来的,它的原型直接指向对象原型,伪数组的原型链中没有数组的原型
举例:
let divList = document.querySelectorAll('div');
这个divList就是为数组,可以通过Array.from转化为数组
let divArray = Array.from(divList)
(3)合并和截取
合并:arr1.concat(arr2)
截取:arr.slice(1);从第二个元素开始截取
arr.slice(0);从第o个开始截取,就是复制数组
JS只提供浅拷贝
3.增删改查
1.增
(1)直接通过下标增(不推荐)
arr[7]=7;如果前面没有留个元素,就变成了稀疏数组
(2)尾部添加
arr.push(newItem);改变arr 返回新长度
let a = [1, 2, 3, 4, 5]
let result = a.push(1)
console.log(result) // 6
console.log(a) // [1, 2, 3, 4, 5, 1]
// More
result = a.push('a', 'b') // 可一次添加多个值
console.log(result) // 8
console.log(a) // [1, 2, 3, 4, 5, 1, 'a', 'b']作者:星梦花随0823链接:https://juejin.cn/post/6844903721697034253来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(3)头部添加
arr.unshift(newItem);改变arr返回新长度
let a = [1, 2, 3, 4, 5]
let result = a.unshift(1)
console.log(result) // 6
console.log(a) // [1, 1, 2, 3, 4, 5]
// More
result = a.unshift('a', 'b') // 可一次添加多个值
console.log(result) // 8
console.log(a) // ['a', 'b', 1, 1, 2, 3, 4, 5]作者:星梦花随0823链接:https://juejin.cn/post/6844903721697034253来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(4)中间增加
arr.splice(index,0,'x');删除也用这个api,从index处删除0个,然后在删除处添加x,就是中间增加
2,删
(1)和对象一样删
let arr = ['a','b','c'];
delete arr['0']; //[empty,'b','c']
用delete删除后长度没有变化,数组就变成了稀疏数组了
arr.length = 1;直接改length,也可以删除,但是不要随便改length
(2)删头部
arr.shift();
(3)删尾部
arr.pop();
(4)从中间删
arr.splice(index,1);删除下标为index的一个元素
arr.splice(index,1,'x');删除下标为index的一个元素,并在删除位置添加x元素
3.查
(1)查看所有属性
let arr = [1,2,3,4,5];
arr.x = 'x';
- Object.keys(arr);//0,1,2,3,4,x
- Object.value(arr);//1,2,3,4,5,x
- for (let key in arr){console.log(
${key}:${arr[key]})}
这三种都会把新添加的x打印出来,不可取
(2)查看数字下标(看着是数字,其实是字符串)属性
- for循环
for (let i = 0 ; i < arr.length ; i++){console.log(${i}:$arr[i])
- forEach API
arr.forEach(function(item,index){console.log(${index}:${item})}
深入理解forEach
function forEach (arr,fn){
for(let i = 0 ; i < arr.length ; i++){
fn(arr[i],i ,arr)
}}
forEach([1,2,3],function(x){console.log(x)});这个函数与forEach的区别就是这个forEach在前面,数组在后,但是JS会自动换过来
for循环和forEach的区别:for是个关键字有continue和break,forEach是个函数,没有这些
(3)查看单个属性
- 和对象一样
let arr = [1,2,3]; arr[0]
注意索引越界,就是arr.length没有那么长,而你查找的长,就会undefined
举例:for(let i = 0 ; i < arr.length ;i++){alert(arr[i].toString)}
报错:Cannot read property ‘toString’ of underfined,意思是读取了某个undefined的toString属性
(4)查找某个元素是否在数组里
arr.indexOf(item);元素存在返回索引,不存在返回-1
(5)按条件查找
arr.find(item => item %2 ===0);找数组中的第一个偶数
arr.find(function(item){return item%5===0});用函数写法
(6)按条件查找索引
arr.findIndex(item=>item%2===0)
4.改
(1)
直接改:arr[2]=3;直接改;
(2)
翻转数组:arr.reverse();翻转数组(改变原数组)
翻转字符串:str.split('').reverse().jion('')
(3)
冒泡排序:arr.sort();从小到大;
arr.sort((a,b) => a-b);从小到大
arr.sort((a,b) = > b-a);从大到小
举例:
var arr [
{name:'张',score:98},
{name:'于',score:93},
{name:'王',score:100},
];
arr.sort(function(a,b){
if(a.score > b.score){return 1}
else if(a.score = b.score){return 0 }
else{return -1}
})
简化:
arr.sort((ab)=>{a.score - b.score});从小到大
(4)map n变n
let week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];let arr = [0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6]let arr2 = arr.map((item) => week[item])console.log(arr2)
(5) filter n变少
let scores = [95, 91, 59, 55, 42, 82, 72, 85, 67, 66, 55, 91]let scores2 = scores.filter(item => item > 60)console.log(scores2) // [95,91,82,72,85,67,66, 91]
(6) reduce n变1
let scores = [95, 91, 59, 55, 42, 82, 72, 85, 67, 66, 55, 91]let sum = scores.reduce((sum, n) => { return sum += n%2===0?0:n}, 0)console.log(sum)