JS中的数组操作

107 阅读5分钟

栈、队列方法

  • pop:从栈尾弹出一个值
  • push:从栈尾推入一个值
        let arr = ['halo', 1, false, 0, 22, 44, 66, 88]
        let val = arr.pop()
        arr.push(6)
        console.log(`从${arr}栈尾弹出一个${val}再推入一个6`); 			//打印出:从halo,1,false,0,22,44,66,6栈尾弹出一个88再推入一个6
  • unshift:从队头推入一个值
  • shift:从队头移出一个值
        let val = arr.shift()
        arr.unshift('你好')
        console.log(`从${arr}栈尾弹出一个${val}再推入一个你好`);				//打印出:从你好,1,false,0,22,44,66,88栈尾弹出一个halo再推入一个你好

splice,数组的增删改

  • 参数:1.开始索引;2.删除元素的个数;3.插入的新元素,可以写多个
        let arr = ['halo', 1, false, 0, 22, 44, 66, 88]					
        arr.splice(1, 2, 'stephen', 'gorge')				//在第一个数组下标,删除两个值,插入'stephen''gorge'两个字符串
        console.log(arr);					//最终打印Array(8) [ "halo", "stephen", "gorge", 0, 22, 44, 66, 88 ]
  • 返回一个由增删元素组成的新数组

concat、join 数组拼接

  • concat 数组拼接
        let arr = [1, 2, 3, 4, 99]
        arr2 = arr.concat(3)					//把数字3和数组arr拼接到一块
        arr3 = arr2.concat([11, 22, 33, 'stephen'])					//把新数组和arr2拼接到一块
        console.log(`既能把数字拼接到数组${arr2};也能把数组拼接到数组${arr3};需要创建新数组,原数组不变${arr}`)
  • join 把数组拼接成字符串
        let arr = ['gorge', 2, 3, 4]			//声明数组					
        let arr1 = arr.join('_')					//数组拼接成字符串,每个值之间用_连接
        let str = 'gorge'									////声明字符串
        console.log(arr1);								//打印出gorge_2_3_4
        console.log(str.split('').reverse().join(''));				//字符串转换为数组,再反转,再转换为字符串,打印出egrog

sort数组排序、reverse数组反转

        let arr = [1, 2, 3, 4, 5]
        arr.reverse()								//反转
        console.log(arr);						//输出 54321

reverse 会修改原数组

  • sort 数组排序
  • 默认将元素转化成字符串进行排序
        let arr1 = [12, 81, 2, 57]
        arr1.sort()
        console.log(arr1);					//打印出[ 12, 2, 57, 81 ]
  • 直接调用sort,会把数组 按照数组转换成字符串后的形式进行转换,字符串比较是 按位比较

如:'ac' > 'ca' false,因为字符串只比较第一位,而 a 的unicode码在 c 的前面,因此a<c

因此,用sort()比较22和132的时候,只会对第一位进行比较,因为2>1,因此会将22放在132后面

  • 一般需要传递排序函数
        let arr1 = [12, 81, 2, 57]
        arr1.sort((v1, v2) => v1 > v2 ? 1:-1)				//传递一个箭头函数,函数里有两个形参,会使用快速排序对数组进行排序,进行交换
        console.log(arr1);					//会打印出正确的排列

上面代码的形式是固定的,如果想从大到小排序,可以把>换成<,或者把 1 和 -1 的位置调换

更复杂的用法

        let arr = [
            {name:'gorge', score:89},
            {name:'stephen', score:98},
            {name:'leo', score:60}
        ]
        arr.sort((num1, num2) => num1.score > num2.score ? 1:-1)
        console.log(arr);				//按照score排序,打印出按score从小到大排序的对象

forEach、.map

arr.forEach(callback) 数组的每一项都交给callback函数操作,callback的参数为

  • 遍历到的对于元素
  • 元素序号
  • 数组本身
        let arr = [1, 3, 5, 7, 9]
        arr.forEach(function(val, i, array){				//三个参数分别是,遍历到的元素、数组下标(从0开始)、数组,可另外命名
            array[i] = val ** 2       //把数组元素的平方给对应数组下标
        })
        console.log(arr);						  //打印出[ 1, 9, 25, 49, 81 ],原数组会改变
  • arr.map(callback) 数组的每一项都交给callback函数操作,callback返回值组成新数组。原数组不变,callback的参数跟forEach一样

.filter、.reduce

  • arr.filter(callback) 过滤出符合条件的元素,构成新数组,原数组不变
        let arr = [
            {name:'gorge', score:70},
            {name:'leo', score:88},
            {name:'stephen',score:59}
        ]
        let arr1 = arr.filter(obj=> obj.score>60)					//过滤出score值大于60的元素赋值给arr1

filter() 为数组中的每个元素调用一次 callbackFn 函数,并利用所有使得 callbackFn 返回 true 或

Truthy(真值) - 术语表 | MDN

的元素创建一个新数组。

  • reduce(function(temp, v), initValue)

遍历数组,调用回调函数,将数组元素组合成一个值

初始值可设置

        let arr = [
            {name:'gorge', score:70},
            {name:'leo', score:88},
            {name:'stephen',score:59}
        ]
        let arr2 = ['g', 'o', 'r', 'g', 'e']
        let sum = arr.reduce((sum, v) => sum + v.score, 0)
        let str = arr2.reduce((sum, v) => sum+v , '')

上面代码中,sum是上一次调用函数时的返回值,初次调用时是设置的初始值,v为从数组下标0开始的每一个数组元素,sum+v为执行函数,最后一个值为初始值

.every、.some

  • .every(callback)

所有回调函数都返回true的时候结果才返回true,否则返回false

        let arr = [0, 1, 5, 8, -3]
        console.log(arr.every(val => val>-5));					//打印true
  • .some(callback)

用法同上,其中一个返回true则输出true

类数组对象、数组转换、空数组等

  • Array.isArray(element) 判断是否为数组
        let arr = [0, 1, 5, 8, -3]
        console.log(Array.isArray(arr))				//是,打印true
  • arr.indexOf(val) 获取val在数组中的下标,找不到返回 -1,如果数组里有几个一样的val,则返回最前面val的下标
        let arr = [1, 1, 5, 8, -3]
        console.log(arr.indexOf(1))					//打印出0
  • arr.inlcudes(val) 判断val是否在数组中,返回true/false
        let arr = [1, 1, 5, 8, -3]
        console.log(arr.includes(-5))				//-5不在数组arr中,输出false
  • Array(len) 创建出长度为len的空数组,空数组里面没有属性,只有长度,undefined也没有
  • arr.fill(val) 把arr全部填充为val
        var arr1 = [0, 2, 4, 6]
        console.log(arr1.fill(1))					//不管原数组里面有什么,把数组元素全部填充为1
  • Array.from(arrayLike) 把一个伪数组对象(拥有length属性和若干索引属性的任意对象)或可迭代对象(可以获取数组中的元素,如字符串)转化为数组,原数组并不会被改变
        let ojb = {0:1, 1:4, 2:1, 4:1, 6:'hh', length:7}			//这是一个伪数组对象,它拥有length属性和数组下标索引
        console.log(Array.from(ojb))					//转化为数组,打印出[ 1, 4, 1, undefined, 1, undefined, "hh" ]
      	console.log(Array.from('gorge'))			//把字符串转化为数组,打印出[ "g", "o", "r", "g", "e" ]
  • [...obj] 把可迭代对象转化为数组
        console.log([...'gorge'])							//把字符串gorge转化为数组,打印出[ "g", "o", "r", "g", "e" ]