You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有支持元素引用删除的JavaScript内置或常用npm数据结构?

满足需求的数据结构方案

浏览器内置实现(自定义封装)

浏览器原生没有直接提供这种开箱即用的数据结构,但可以基于Map快速封装一个符合要求的版本:

function RefList() {
  const store = new Map();
  let idCounter = 0;

  // 添加元素并返回删除引用
  this.push = function(item) {
    const currentId = idCounter++;
    const deleteRef = {
      delete: () => store.delete(currentId)
    };
    store.set(currentId, { item, deleteRef });
    return deleteRef;
  };

  // 遍历元素
  this.forEach = function(callback) {
    for (const { item } of store.values()) {
      callback(item);
    }
  };

  // 也支持通过引用删除的备选方法
  this.remove = function(ref) {
    for (const [id, entry] of store.entries()) {
      if (entry.deleteRef === ref) {
        store.delete(id);
        return true;
      }
    }
    return false;
  };
}

// 测试用例
let list = new RefList();

list.push(10);
let ref1 = list.push(20);
let ref2 = list.push(30);
list.push(40);

ref1.delete();
ref2.delete();

list.forEach(item => console.log(item)); // 输出:10、40

常用npm包方案

有不少成熟的npm包已经实现了这类支持引用删除的链表结构,举两个常用的例子:

1. doubly-linked-list

这个包实现了双向链表,push操作返回的节点本身就是删除引用,直接调用remove()方法即可删除对应元素:

const DoublyLinkedList = require('doubly-linked-list');

let list = new DoublyLinkedList();

list.push(10);
let ref1 = list.push(20);
let ref2 = list.push(30);
list.push(40);

ref1.remove();
ref2.remove();

list.forEach(item => console.log(item)); // 输出:10、40

2. collections 库的 LinkedList

collections 库提供的LinkedList支持两种删除方式:调用list.delete(node)或者节点自身的remove()方法:

const { LinkedList } = require('collections');

let list = new LinkedList();

list.push(10);
let ref1 = list.push(20);
let ref2 = list.push(30);
list.push(40);

list.delete(ref1);
list.delete(ref2);

list.forEach(item => console.log(item)); // 输出:10、40

内容的提问来源于stack exchange,提问作者AndreKR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:53:15