数据结构与算法之数组
介绍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))