js数组总结

129 阅读4分钟

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)