Hi,这里是正在参加青训营🪖的JustHappy,最近不是正好在使用MarsCode AI刷题,正好趁着这个机会再整理一遍在JavaScript中的数据结构的基本操作,争取做到最简单,多一行代码不行、少一行代码不跑那种!这是个人的学习笔记,写的很简单,如果大家想要比较详细的数据结构介绍,推荐去 Hello算法 瞅瞅
数组这个数据结构就不在这里记录了...
栈 Stack
基本代码
const stack = [];
// 入栈操作
stack.push(1);
stack.push(2);
// 出栈操作
const item1 = stack.pop();
const item2 = stack.pop();
使用场景
- 所有需要后进先出的场景
前端与栈:JS中的函数调用堆栈
队列queue
- 队列是一个先进先出的数据结构
- 在JavaScript中并没有队列的数据结构,所以我们用数组模拟一个
基本代码
const queue = [];
// 入队操作
queue.push(1);
queue.push(2);
// 出队操作
const item1 = queue.shift();
const item2 = queue.shift();
场景
- 所有需要先进先出的场景
例子:
- JS异步的任务中的任务队列
- 计算最近请求次数
JS异步的任务中的任务队列
链表LinkList
- 多个元素组成的列表
- 元素存储不连续,用next指针连在一起
基本代码
const a = { val: "a" };
const b = { val: "b" };
const c = { val: "c" };
const d = { val: "d" };
a.next = b;
b.next = c;
c.next = d;
// 遍历链表
let p = a;
while (p) {
console.log(p.val);
p = p.next;
}
// 在链表中插入节点
const e = { val: "e" };
c.next = e;
e.next = d;
// 删除节点
c.next = d;
数组 VS 链表
- 数组:增删非首位元素时候往往需要移动元素
- 链表:增删非首位元素时候,只要修改next指针的指向就行
JS中的原型链
- 原型链的本质上是链表
- 原型链上的节点是各种原型对象:
比如Function.prototype、Object.prototype......
- 原型链通过__proto__属性连接各种原型对象
使用链表指针获取JSON的节点值
集合Set
- 一种无序且唯一的数据结构
- ES6中有集合,名为set
- 集合的常用操作:去重、判断某一个元素是否在集合中、求交集......
基本代码
// 去重
const arr = [1, 1, 2, 2];
const arr2 = [...new Set(arr)];
// 判断元素是否在集合中
const set = new Set(arr);
const has = set.has(3);
// 求交集
const set2 = new Set([2, 3]);
const set3 = new Set([...set].filter((item) => set2.has(item)));
// 求差集
const set4 = new Set([...set].filter((item) => !set2.has(item)));
// 添加元素
let mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add(5); // 重复元素只会添加一次
mySet.add("some text"); // 添加字符串
mySet.add(true); // 添加布尔值
mySet.add({ a: 1 }); // 添加对象
const obj = { a: 1 }; // 添加对象,看起来和上面的添加对象是重复的,但是在内存中是不同的对象
mySet.add(obj); // 添加对象
mySet.add(undefined); // 添加 undefined
mySet.add(null); // 添加 null
// 删除元素
mySet.delete(5); // 删除元素
// 迭代集合
for (let item of mySet) {
console.log(item);
}
for (let item of mySet.keys()) {
console.log(item);
}
for (let item of mySet.values()) {
console.log(item);
}
// 集合和数组的相互转换
const myArr = [...mySet];
const mySet2 = new Set(myArr);
前端与集合:使用ES6中的Set
字典Map
- 与集合类似,字典也是一种存储唯一值的数据结构,但是它是以键值对的形式来存储的
- 在ES6中有字典,名为Map
基本代码
const m = new Map();
// 增
m.set("aa", "a");// aa为key,a为value
// 查
m.get("aa");
// 删
m.delete("aa");
// 判断是否存在某个key
m.has("aa");
// 改
m.set("aa", "b");// aa为key,b为value