JavaScript - 总结【Array】

(一)如何判断一个对象是否是数组 - 2种

  • instanceof 操作符
    const cars = ['Audi', 'Benz', 'BMW']
    cars instanceof Array	// true
    
  • Array.isArray()方法
    const cars= ['Audi', 'Benz', 'BMW']
    Array.isArray(cars)		// true
    

(二)创建数组的方式 - 4种

  • 使用 Array 构造函数

    const arr1 = new Array()	// []
    const arr2 = new Array(5)	// [ <5 empty items> ] 传入一个数值,会被解析会数组的 length,并创建该数组
    const arr3 = new Array('red', 'green', 'blue', 6)	//  ['red', 'green', 'blue', 6] 传入要保存的元素,会直接创建包含 传入项 的数组
    

    注意
    (1)new 操作符可省略
    (2)如果在构造函数中传入一个 数值,则会创建一个长度为 该数值的新数组;如果传入的是其他类型的 数据,会被当做数组项来解析

  • 数组字面量

    const arr4 = []
    

    注意
    (1)使用数组字面量创建数组时,不会调用 Array 构造函数

  • ES6 中新增的 Array.from() & Array.of()
    Array.from() - 用于将 类数组 转换为 数组
    Array.of() - 用于将 一组参数 转换为 数组

    const str = 'hello world!'
    Array.from(str)				// [ 'h', 'e', 'l', 'l', 'o' ]
    Array.of(1, 3, 5, 7, 9)		// [ 1, 3, 5, 7, 9 ]
    

    注意
    (1)类数组一般指:一个可迭代的数据结构 或 提供了 length 属性和可索引元素的结构

(三)迭代器方法

在 ES6 中,在 Array 的原型上提供了三个用于检索 数组内容 的方法

  • Object.keys() — 返回数组 索引 的迭代器
  • Object.values() — 返回数组 元素 的迭代器
  • Object.entries() — 返回数组 索引/值 的迭代器
const cars =  ['Audi', 'Benz', 'BMW']
Object.keys(cars)		// [ '0', '1', '2' ]
Object.values(cars)		//  [ 'Audi', 'Benz', 'BMW' ]
Object.entries(cars)	//  [ [ '0', 'Audi' ], [ '1', 'Benz' ], [ '2', 'BMW' ] ]

(四)栈方法

数组提供了 push() & pop() 方法,可以使数组成为像栈一样 后进先出(LIFO)的结构!

  • push() 方法:新增方法 (又名:推入) 接收任意数量的参数,会把参数添加到数组的末尾,并返回数组的最新长度
  • pop() 方法:删除方法 (又名:弹出) 删除数组末尾的最后一项,并返回被删除的元素
const cars =  ['Audi', 'Benz', 'BMW']
const len = cars.push('Porsche')	// 4
const delItem = cars.pop()			// 'Porsche'

(五)队列方法

数组提供了 unshift() & shift() 方法,可以使数组成为像队列一样 先进先出(FIFO)的结构!

  • unshift(): 新增方法,在数组的开头添加任意多的值,并返回数组的最新长度
  • shift():删除方法,删除数组开头的第一项,并返回被删除的项
const cars =  ['Audi', 'Benz', 'BMW']
const len = cars.unshift('JEEP')	// 4
const delItem = cars.shift()			// 'JEEP'

(六)排序方法

数组有两个方法可以用来对元素进行排序:reverse() & sort() 方法

  • reverse():将数组元素 反向 排列
  • sort():默认按照 升序 的方式排列数组元素
const nums = [1, 2, 13, 4, 15]
nums.reverse()		// [ 15, 4, 13, 2, 1 ]
nums.sort() 		// [ 1, 13, 15, 2, 4 ]

因为 sort() 方法在工作时,会把每一项元素转换为字符串再进行比较,结果出现了:2 比 15 大,所以,在使用 sort() 方法时,可以传递一个 比较函数 给 sort() 方法:

// 完整写法
nums.sort((a, b) => a < b ? -1 : a > b ? 1 : 0)		// [ 1, 2, 4, 13, 15 ]

// 简写(常用)
nums.sort((a, b) => a - b)		// [ 1, 2, 4, 13, 15 ]

比较函数:其接收两个参数,如果第一个参数应该排在第二个参数前面,则返回一个负值;如果第一个参数应该排在第二个参数后边,则返回一个正值;如果两个参数相等,返回0即可;

(七)操作方法

  • concat() 方法:可接受任意多参数,在现有数组后面进行拼接
	const cars = ['Audi', 'Benz', 'BMW']
	const newCars = cars.concat('JEEP', ['Porsche', 'Bentley'])
	console.log(cars)		// cars ==> [ 'Audi', 'Benz', 'BMW' ]
	console.log(newCars)	// newCars ==> [ 'Audi', 'Benz', 'BMW', 'JEEP', 'Porsche', 'Bentley' ]
  • slice() 方法:截取 数组元素
    • 只传入一个参数:返回该索引到数组末尾的所有元素
    • 传入两个参数:第一个值作为开始截取位置的索引,第二值作为结束截取的索引位置 ( start, end ]
const cars = [ 'Audi', 'Benz', 'BMW', 'JEEP', 'Porsche', 'Bentley' ]
const cars1 = cars.slice(2)			// [ 'BMW', 'JEEP', 'Porsche', 'Bentley' ]
const cars2 = cars.slice(1, 4)		// [ 'Benz', 'BMW', 'JEEP' ]
const cars3 = cars.slice(-2, -4)	// [ 'BMW', 'JEEP' ]
const cars3 = cars.slice(-4, -2)	// []
  • splice() 方法:在数组中 插入元素
    • 删除:接收两个参数,第一个参数为删除元素的起始位置,第二个参数为删除的数量 【返回 被删除元素组成的数组 】
    • 插入:接收三个参数,分别为:开始位置、0(要删除元素的数量) 和 要插入的元素 【返回空数组 】
    • 替换:接收三个参数,分别为:开始位置、删除元素的数量 和 要插入的元素 【返回 被删除元素组成的数组 】
const cars = [ 'Audi', 'Benz', 'BMW', 'JEEP', 'Porsche']
cars.splice(1, 2)		// [ 'Benz', 'BMW' ] 此时cars为 ==> [ 'Audi', 'JEEP', 'Porsche']
cars.splice(1, 0, 'BYD', '红旗')	// [] 此时cars为 ==> [ 'Audi', 'BYD', '红旗', 'JEEP', 'Porsche' ]
cars.splice(1, 2, '东方红')		// [ 'BYD', '红旗' ] cars为 ==> [ 'Audi', '东方红', 'JEEP', 'Porsche' ]

小结:先前提到的:push()、pop()、unshift()、shift()、reverse()、sort() 和 splice() 这七个方法,均会对原数组进行修改,所以 Vue2 中数据响应式对数组的七个方法进行了重写

(八)搜索和位置方法

  • 严格相等
    ES提供了3个严格相等的方法,分别是:indexOf()、lastIndexOf()、includes();
    • 它们均可提供两个参数,分别是要查找的元素和【可选】的起始搜索位置;
    • indexOf()与lastIndexOf()两个方法都会返回要查找元素在数组中的 位置,如果没有找到则返回 -1
    • includes()返回布尔值,表示是否至少找到了一个与指定元素匹配的项;
    • 比较时,采用全等(===)比较,比较的两项必须严格相等。
    const cars = [ 'Audi', 'Benz', 'BMW', 'JEEP', 'Porsche']
    console.log(cars.indexOf('Benz'))			// 1 当前元素的位置
    console.log(cars.lastIndexOf('Benz'))		// 1 从尾部向前找,该元素第一次出现的位置,仍然是1
    console.log(cars.includes('Audi'))			// true
    
  • 断言函数
    ES中的find() 和 findIndex()方法使用了断言函数;
    • 断言函数接受三个值:element、index、array;
      element:当前搜索的元素
      index:当前元素的索引
      array:当前正在搜索的数组
    • find()方法:返回第一个匹配元素的项;
    • findIndexOf()方法:返回第一个匹配元素的索引;
    • 找到匹配项后,均不再继续搜索。
    const cars = [
      {name: 'Audi', color: 'red', price: '100'},
      {name: 'BMW', color: 'blue', price: '200'},
      {name: 'Benz', color: 'black', price: '300'},
    ]
    cars.find((ele, idx) => ele.price > 200) 		// {name: 'Benz', color: 'black', price: '300'}
    cars.findIndex((ele, idx) => ele.price > 200) 	// 2
    

(九)迭代方法

ES 为数组定义了5个迭代方法,每个方法均可接收两个参数:以每一项为参数运行的函数和【可选】的作用域对象;

  • every():
    对数组的每一项都运行传入的函数,如果对每一项函数都返回true,那么方法返回true;
  • some()
    对数组的每一项都运行传入的函数,如果有一项返回true,那么方法返回true;
  • forEach()
    对数组的每一项都运行传入的函数,没有返回值;
  • map()
    对数组的每一项都运行传入的函数,并返回由美词函数调用的结果构成的数组
  • filter()
    对数组的每一项都运行传入的函数,并返回由函数返回true的项组成的新数组
let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
nums.every((item, index, array) => item > 0) 		// true 所有项都大于0
nums.some((item, index, array) => item < 2)			// true 第一项满足条件
nums.forEach()										// 相当于for循环
nums.map((item, index, array) => item * 2)			// [2, 4, 6, 8, 10, 12, 14, 16, 18]
nums.filter((item, index, array) => item % 2 === 0) // [2, 4, 6, 8]

(十)归并方法

ES为数组提供了两个归并方法,分别是;reduce()和reduceRight()

  • 它们都会迭代数组的所有项,并在此基础上构建一个最终返回值;
  • 二者的区别在于遍历数组元素的方向不同,一个是从前往后、另一个是从后往前;
  • 方法接收两个参数
    • 对每一项都会运行的归并函数------接收4个参数,分别是:
      上一个归并值(如果第二项没有指定起始值,那么此处值应为数组的第一项)
      当前项
      当前项的索引
      数组本身
    • 【可选】的起始值
let nums = [1, 2, 3, 4, 5]
nums.reduce((prev, cur, index, array) => prev += cur, 100) 		// 115 起始值为:100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值