刷题前最好先看看数据结构:JS数据结构基本操作「上」| 豆包MarsCode AI 刷题

73 阅读3分钟

Hi,这里是正在参加青训营🪖JustHappy,最近不是正好在使用MarsCode AI刷题,正好趁着这个机会再整理一遍在JavaScript中的数据结构的基本操作,争取做到最简单,多一行代码不行、少一行代码不跑那种!这是个人的学习笔记,写的很简单,如果大家想要比较详细的数据结构介绍,推荐去 Hello算法 瞅瞅

javascript-illustration.png

数组这个数据结构就不在这里记录了...

栈 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();

场景

  • 所有需要先进先出的场景

例子:

  1. JS异步的任务中的任务队列
  2. 计算最近请求次数

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