【飞飞猿 x 数据结构与算法】第1期 | 最常用的数据结构-数组

74 阅读5分钟

数据结构与算法之数组

介绍TypeScript

  • 渐进式包含类型的JavaScript超集。
  • 为JavaScript提供类型支持,实现静态检查。
  • TypeScript在编译时进行了类型和错误检测,但并不会阻止编译器生成JavaScript代码。

类型推断

let age: number = 20
let isFlag: boolean = true
let language: string = 'javaScript'

TypeScript会根据为变量赋的值自动给该变量设置一个类型。

let age = 20; // 数
let isFlag = true; // 布尔值
let language = 'javaScript'; // 字符串

如果声明了一个变量但没有设置其初始值,推荐为其设置一个类型,如果没有为设置类型,意思是可以接收任何值,就像在普通JavaScript中一样

let langauage: string
let langs = ['js','ruby','c']
langauage = 'javascript'

接口

  • 给变量设置一个类型
interface Person {
  name: string;
  age: number;
}

function printName(person: Person) {
  console.log(person.name)
}

它是对一个对象必须包含的属性和方法的描述

  • 接口是一份合约
interface Comparable {
  compareTo(b):number;
}
class MyObject implements Comparable {
  age: number;
  compareTo(b):number {
    if(this.age === b.age) {
      return 0
    }
    return this.age > b.age ? 1 : -1
  }
}

泛型

interface Comparable<T> {
  compareTo(b:T):number;
}
class MyObject implements Comparable<MyObject> {
  age: number;
  compareTo(b: MyObject):number {
    if(this.age === b.age) {
      return 0
    }
    return this.age > b.age ? 1 : -1
  }
}

数组

数组存储一系列同一种数据类型的值

const averageTemp = []
averageTemp[0] = 31.9
averageTemp[1] = 35.3
averageTemp[0] = 42.4
averageTemp[0] = 52
averageTemp[0] = 60.8

数组的创建方式

  • new 创建
const arr = new Array() // 创建一个空数组
const arr = new Array(7) // 创建一个指定长度的数组
const arr = new Array('a','b','c') // 创建一个指定元素的数组
  • 字面量创建
let arr = []  // 创建一个空数组
let arr = ['a', 'b', 'c'] // 创建一个指定元素的数组

数组的方法

push() // 末尾插入元素
unshift() // 头部插入元素
pop // 末尾删除元素
shift() // 头部删除元素
splice() // 任意位置添加或删除元素
  splice(5,3)  // 从索引5处开始删除
  splice(5,0,2,3,4) // 从索引5处开始添加
const arr1 = [1,2,3]
const arr2 = [-1,-2]
const zero = 0

let num = arr2.concat(zero, positiveNumbers)
console.log(num) // -1,-2,0,1,2,3
1.使用every方法迭代
// every方法会迭代数组中的每个元素,直到返回false
const num = [1,2,3]
const isEven = x => x % 2 === 0
num.every(isEven)
2.使用some方法迭代
// some方法会迭代数组中的每个元素,直到返回true
num.some(isEven)
3.使用forEach方法迭代
// forEach方法跌倒整个数组
num.forEach(x => console.log(x%2 === 0))
4.使用map和filter方法
// map和filter都是返回新数组的迭代方法
const myMap = num.map(isEven)  // 新数组由函数返回的运行结果组成
const evenNum = num.filter(isEven) // 新数组由函数返回的true的元素组成
5.使用reduce方法
// reduce方法接收四个参数的函数:previousValue、currentValue、index和array
// index和array是可选的参数,可传可不传
// reduce方法停止执行后会返回一个累加器的值,例如:对一个数组中的所有元素求和
num.reduce((previous,current) => previous + current)

ECMAScript6和数组的新功能

for(const n of num) {
  console.log(n % 2 === 0 ? 'even' : 'odd')
}
iterator = num[Symbol.iterator]()
for(const n of iterator) {
  console.log(n)
}
// 三种从数组中得到迭代器的方法
// 1. entries方法返回包含键值对的@@iterator
let aEntries = num.entries() // 得到键值对的迭代器
console.log(aEntries.next().value) // [0,1]位置0的值为1

aEntries = num.entries() // 得到键值对的迭代器
for(const n of aEntries) {
  console.log(n)
}

// 2.keys方法返回包含数组索引的@@iterator
const aKeys = num.keys(); // 得到数组索引的迭代器
console.log(aKeys.next()); // {value:0,done:fales}

// 3.values方法返回包含数组值的@@iterator
const aValues = num.values(); // 得到数组索引的迭代器
console.log(aValues.next()); // {value:1,done:fales}
// Array.form方法根据已有的数组创建一个新数组
let num2 = Array.from(num)
// 传入一个用来过滤值的函数
let evens = Array.from(num, x => (x % 2 == 0))
// Array.of方法根据传入的参数创建一个新数组
let num = Array.of(1,2,3) // num=[1,2,3]
// 复制已有的数组
let numCopy = Array.of(...num) //numCopy=[1,2,3,4]
let numCopty = Array.of(1,2,3,4,5,6) // numCopy = [1,2,3,4,5,6]
numCopy.fill(0)  // 所有位置上的值变为0 [0,0,0,0,0,0]
numCopy.fill(2,1) // 从1开始的所有位置上都是2 [0,2,2,2,2,2]
numCopy.fill(1,3,5) // 将1填充到数组索引3到5(不包含3和5)的位置 [0,2,2,1,1,2]

// 创建数组并初始化
let ones = Array(6).fill(1) // [1,1,1,1,1,1]
// copyWithin方法复制数组中的一系列元素到同一数组指定的起始位置
copyArray = [1,2,3,4,5,6]
copyArray.copyWithin(1,3,5)   // 得到的数组是[1,4,5,4,5,6]

排序元素

const num = [1,2,3]
// 1.反序方法
num.reverse()  // [3,2,1]
// 2.排序方法
function compare(a, b) {
  if(a < b) {
    return -1
  }
  if(a > b) {
    return 1
  }
  return 0  // a===b
}
num.sort(compar)  // 升序
const friends = [
  {name:'zhangsan',age:30},
  {name:'lisi',age:20},
  {name:'wangwu',age:25}
]

function compare(a, b) {
  if(a.age > b.age) {
    return -1
  }
 if(a.age < b.age) {
   return 1
 }
  return 0
}

friends.sort(compare)
// 字符串排序是根据ASCII值来比较的
let names = ['Ana', 'ana', 'john', 'John']
names.sort() // ['Ana', 'John', 'ana', 'john']

搜索方法

// 搜索有两个方法: indexOf lastIndexOf
// indexOf()方法返回与参数匹配的第一个元素的索引,不存在返回-1
// lastIndexOf()方法返回与参数匹配的最后一个元素的索引,不存在返回-1
const num = [1,2,3,4,5,6]
num.indexOf(1)  // 0
num.indexOf(10)  // -1
num.push(1)
num.lastIndexOf(1) // 6
num.lastIndexOf(10) // -1

//1.ECMAScript 2015 —— find和findIndex方法
// find和findIndex方法接收一个回调函数,搜索一个满足回调函数条件的值
// find方法返回第一个满足条件的值,findIndex方法则返回这个值在数组中的索引
function multipleOf(element, index, array) {
  return (element % 13 === 0)
}

num.find(multipleOf)
num.findIndex(multipleOf)
// 2.ECMAScript7 —— 使用includes方法
// 如果数组中存在某个元素,includes方法会返回true,否则返回false
num.includes(3) // true
num.includes(3,4) // 从索引3处开始搜索元素4的位置

输出数组为字符串

// toString和join
// toString:数组里所有元素输出为一个字符串
num.toString()
// join:用不同的分隔符将元素隔开
num.join('-')

类型数组

JavaScript数组不是强类型的,因此它可以存储任意类型的数据。

类型数组则用于存储单一类型的数据。

// 语法
let myArray = new TypedArray(length)

// TypedArray可以替换为以下所列之一

const length = 5
let int16 = new Int16Array(length)
let array16 = []
array16.length = length
for(let i = 0; i<length;i++) {
  int16[i] = i + 1
}
console.log(int(16))

结语

公众号首.png