JS数组

77 阅读5分钟

创建数组

let arr = new Array(1,2,3)等价于let arr=(1,2,3)

let arr = new Array(3) 即是创建一个长度为三的数组

转化: let arr='1,2,3' 可以用arr.split(','),即用逗号分隔开创建数组

let arr='1,2,3'
arr.split(',')
// ['1', '2', '3']

let arr='123' 可以用arr.split(''),即用空字符串分隔开创建数组

let arr1='123'
arr1.split('')
// ['1', '2', '3']

Array.from('123')将不是数组的东西变成数组

Array.from('123')
// ['1', '2', '3']

伪数组的原型链中并没有数组的原型,它的原型直接指向对象的原型
没有push之类数组所共有的属性那就是伪数组,此时就可以用Array.from()来将其变成数组

注意:碰到到伪数组那就立刻转换为数组

两个数组合并变成新数组:arr1.concat(arr2) concat连接,返回一个新数组,原有数组不变

let arr1=[1,2,3,4]
let arr2=[7,8,9]
arr1.concat(arr2)
// [1, 2, 3, 4, 7, 8, 9]

截取一个数组的一部分:arr.slice(2) 切掉前2个,不会改变原数组

let arr1=[1,2,3,4]
arr1.slice(2)
// [3, 4]
arr1
// [1, 2, 3, 4]

arr.slice(0) 切掉前0个,即保留截取所有元素。常用来复制数组。

arr1.slice(0)
// [1, 2, 3, 4]

JS只提供浅拷贝

增删改查数组中的元素

  • 不会改变长度
  1. delete
let arr=['a','b','c']
delete arr[0]
  1. 改变数组的length可以删掉数组 删掉之后就会删掉'a',但不会改变长度,这两种都不推荐
  • 会改变长度
  1. 删掉头部:arr.shift() arr 被修改,并返回被删元素
  2. 删掉尾部:arr.pop() arr 被修改,并返回被删元素
  3. 删掉中间的:arr.splice(下标,个数) 从下标的地方包括该元素,删掉几个元素,并返回被删元素
  4. arr.splice(下标,个数,改成什么) 从下标的地方包括该元素,删掉几个元素,并改成什么元素,并返回被删元素

arr.splice(5,1,6666,777,888)删掉下标为5的元素,只删一个,并且在该位置添加6666,777,888

let arr=[1,2,3,4,5,6,7,8]
arr.splice(5,1,6666,777,888)
// [6]
arr
// [1, 2, 3, 4, 5, 6666, 777, 888, 7, 8]
let arr1=[1,2,3,4,5,6,7,8,9,0]
arr1.splice(2,3,6666,777,888)
// [3, 4, 5]
arr1
// [1, 2, 6666, 777, 888, 6, 7, 8, 9, 0]
arr1.splice(2,3,'x')
// [6666, 777, 888]
arr1
// [1, 2, 'x', 6, 7, 8, 9, 0]

let arr=[1,2,3,4,5,6,7,8]
for(let i=0; i<arr.length;i++){
    console.log(`${i}:${arr[i]}`)
}
// 0:1
// 1:2
// 2:3
// 3:4
// 4:5
// 5:6
// 6:7
// 7:8
arr.forEach(function(xxx,yyy){
console.log(`${yyy}:${xxx}`)
})

相当于

function forEach(array,fn){
for(let i=0; i<arr.length;i++){
    fn(array[i],i)
}
forEach(['a','b','c'],function(x,y){
console.log(x,y)})

将当前参数、下标、数组本身都打印出来

function forEach(array,fn){
for(let i=0; i<arr.length;i++){
    fn(array[i],i,array)
}
forEach(['a','b','c'],function(x,y,z){
console.log(x,y,z)})//将当前参数、下标、数组本身都打印出来

区别是什么 问到该问题的时候 就要回答他能做到另一个不能做到的情况

第一种随时可以用break或者continue停止,forEach只要执行就无法中止。for循环是关键字,没有块级作用域,forEach是函数,是函数作用域

  • 查看单个属性

image.png

  • 查找某个元素是否在数组里
  1. arr.indexOf(item) 存在返回索引,否则返回-1
  2. 使用条件查找元素
  • arr.find(function(x){return x%5===0)}//写符合的某个条件,只会返回第一个符合条件的元素
  • arr.findIndex(function(x){return x%5===0)}//写符合的某个条件,返回第一个对应的元素下标

  1. 在尾部添加 arr.push
arr1.push('a','b','c')
// 7
arr1
// [1, 2, 3, 4, 'a', 'b', 'c']
  1. 在头部添加 arr.unshift
arr1.unshift(0)
// 8
arr1
// [0, 1, 2, 3, 4, 'a', 'b', 'c']

image.png

  1. 反转顺序arr.reverse() // 会直接修改原数组
  • 面试题:如何把字符串换位置 s.split('').reverse().join('')先分开成为字符串,再反转,再合并起来
let s='abcde'
// undefined
s.split('')
// ['a', 'b', 'c', 'd', 'e']
s.split('').reverse()
// ['e', 'd', 'c', 'b', 'a']
s.split('').reverse().join('')
//'edcba'
  1. 自定义顺序
  • 排序
  1. arr.sort() 会从小到大自动排列,等价于arr.sort((a,b)=>a-b)

arr.sort((a,b)=>b-a)即从大到小

  1. arr.sort((a,b)=>a.score-b.score)

  2. arr.sort((a,b)=>a-b)

let stu=[{name:'a',score:12},{name:'b',score:34},{name:'c',score:87},{name:'d',score:99}]
// undefined
stu.sort((a,b)=>a.score-b.score)
// 0: {name: 'a', score: 12}
// 1: {name: 'b', score: 34}
// 2: {name: 'c', score: 87}
// 3: {name: 'd', score: 99}
// length: 4
stu.sort((a,b)=>b.score-a.score)
// 0: {name: 'd', score: 99}
// 1: {name: 'c', score: 87}
// 2: {name: 'b', score: 34}
// 3: {name: 'a', score: 12}
// length: 4
let arr=[1,2,3,4,5,6,7,8]
arr.sort((a,b)=>b-a)
// [8, 7, 6, 5, 4, 3, 2, 1]
let arr=[1,2,3,4,5,6,7,8]
arr.sort((a,b)=>a-b)
// [1, 2, 3, 4, 5, 6, 7, 8]
  • 数组变换
  1. map n 变 n
arr
// [1, 2, 3, 4, 5, 6, 7, 8]
arr.map(item=>item*item)
// [1, 4, 9, 16, 25, 36, 49, 64]
arr.map(item=>item-1)
// [0, 1, 2, 3, 4, 5, 6, 7]
  1. fliter n 变少
arr.filter(item=>item%2==0)
// [2, 4, 6, 8]
  1. reduce n变1
arr.reduce((sum,item)=>{return sum+item},0)
// 36

可以简化sum操作,0为sum的初始值,可以代替map

arr.reduce((result,item)=>{return result.concat(item*item)},[])
// [1, 4, 9, 16, 25, 36, 49, 64]

代替fliter

arr.reduce((add,item)=>{
    if (item%2==1){return add}
    else{return add.concat(item)}
},[])
// [2, 4, 6, 8]

简化

arr.reduce((add,item)=>
    add.concat(item % 2==1 ? [] :item),[])

4.png

课后作业

  1. 输出60分以上学生成绩
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]
  1. 将0-6转换为周一到周日
let arr = [0,1,2,2,3,3,3,4,4,4,4,6]
let arr2 = arr.map((i)=>{
  const hash = {0:'周日',1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六'}
  return hash[i]
})
console.log(arr2)
  1. 算出奇数之和
let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let sum = scores.reduce((sum, n)=>{
  if(n%2==1){
    return sum+n
  }else{
    return sum
  }
},0)
console.log(sum) // 奇数之和:598 

简化版本

let scores = [95,91,59,55,42,82,72,85,67,66,55,91]
let sum = scores.reduce((sum, n)=>{
  return n%2===0?sum:sum+n
},0)
console.log(sum) // 奇数之和:598 

代码

      //  在数组末尾添加
      var arr = [1, 2, 3];
      arr.push(4, 5, "pink");
      console.log(arr);

      //  在数组前边添加
      arr.unshift("red");
      console.log(arr);

      //  删除数组的最后一个元素
      arr.pop();
      console.log(arr);

      //  删除第一个
      arr.shift();
      console.log(arr.shift());
      console.log(arr);

      //  翻转数组
      var arr = [1, 2, 3, 4];
      arr.reverse();
      console.log(arr);

      //  数组排序  冒泡排序  升序
      var arr1 = [19, 2, 6, 3, 4];
      arr1.sort(function (a, b) {
        return a - b;
      });
      console.log(arr1);

      //  数组排序  冒泡排序  降序
      var arr1 = [19, 2, 6, 3, 4];
      arr1.sort(function (a, b) {
        return b - a;
      });
      console.log(arr1);

      //  返回数组的索引号  只返回第一个满足的索引号,如果找不到则返回-1
      var arr2 = ["yellow", "pink", "orange", "blue"];
      console.log(arr2.indexOf("yellow"));

      //  数组转换为字符串  方法一
      var arr3 = [1, 2, 3];
      console.log(arr3.toString());

      //  数组转换为字符串  方法二
      var arr4 = ["yellow", "pink", "blue"];
      console.log(arr4.join());
      console.log(arr4.join("-"));
      console.log(arr4.join("&"));

      // concat()  连接两个或多个数组,不影响原数组  返回一个新的数组
      console.log(arr4.concat(arr3));

      // slice()  数组截取slice(begin, end) 返回被截取的新数组
      var arr2 = ["yellow", "pink", "orange", "blue"];
      console.log(arr2.slice(1, 2));
      // splice()  数组删除splice(第几个开始,要删除的个数)  返回被删除项目的新数组
      var arr5 = ["a", "b", "c", "d", "e", "f", "g"];
      console.log(arr5.splice(0, 3));