算法
-
确定数据结构
- 需要保证顺序关系,数组,链表 频繁增删O(1)->链表
- 对数据读取时,时间复杂度O(1)=>使用哈希表,最终采用双向链表+哈希表
- 双向链表按最后一次访问的顺序排序
- 哈希表,以key为键,以链表节点地址为值
-
put操作 通过哈希表查看传入的key是否对应链表节点
- 如果存在
- 将链表节点值更新
- 将该链表节点调整至链表头部
- 如果不存在
- 容量未满,生成新节点,调整至头部
- 容量已满,删除尾节点,新生成节点,将该节点调整至链表头部
- 将新生成的节点,存入哈希表
- 如果存在
-
get操作,通过哈希表,查看传入的关键字对应的链表节点
- 节点存在,将节点调整至头部,返回值
- 节点不存在,返回null
-
上面是通用的思路,具体到js语言特性上,可以利用Map这个数据结构本身保留set属性顺序的特点更方便的实现
TS -体操
Pick的实现
从接口中分离出部分属性组成新的接口,利用keyof Operator 和Mapped Types部分内容
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
// @ts-expect-error
MyPick<Todo, 'title' | 'completed' | 'invalid'>,
]
interface Todo {
title: string
description: string
completed: boolean
}
interface Expected1 {
title: string
}
interface Expected2 {
title: string
completed: boolean
}
// ============= Your Code Here =============
type MyPick<T, K extends keyof T> = {
[property in K]: T[property]
}