是否有支持元素引用删除的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
相关产品推荐
相关产品推荐

