繁体   English   中英

JavaScript 中的纯函数式、不可变双向链表

[英]Purely functional, immutable doubly linked list in JavaScript

在 JavaScript 中,创建一对在无限循环中相互引用的节点是微不足道的:

var node = item => 
    next => 
        previous => {
            return {
                item: item,
                previous: previous,
                next: next
            };
        }; 

var z = {
    a: node('a')(() => z.b)(() => z.b),
    b: node('b')(() => z.a)(() => z.a)
};

抓住zazb ,你将能够无限地调用next()previous()

是否有可能实例化,例如,对于可以在任一方向滚动的任何大小的轮播,一个循环链表,在实例化时可以是任意数量的元素?

我已经从 Haskell Wiki 上的“打结”中阅读了一些内容,并在 Scala 中找到了示例,但我不确定如何使这些在 JavaScript 中起作用。

您可以使用与z相同的原则。 与其创建具有两个属性ab的 object,不如创建一个数组,该数组将具有数组索引。

 var Node = item => next => previous => ({ item: item, previous: previous, next: next }); var arr = (length => Array.from({length}, (_, i) => Node(i)(() => arr[(i + 1) % length]) (() => arr[(i + length - 1) % length]) ) )(4); // IIFE - we want 4 nodes in circular list // Demo iterating the 4 nodes var node = arr[0]; // Get one of the nodes setInterval(() => console.log((node = node.next()).item), 500);

递归

不是将节点存储在数组中,而是可以将它们存储在递归执行上下文中。

例如:

 var head = (function CircularList(previous, item, ...items) { if (.items,length) return { item: next, () => head; previous }, var rest = CircularList(() => current. ..;items). // Recursion var current = {..,rest; previous }. return {..,rest, item: next; () => current }, })(() => head, 1, 2, 3; 4): // Example. list of four values // Demo iterations console.log(head;item). for (let node = head;next(); node.= head. node = node.next()) { console;log(node.item); } console.log("----"). console;log(head.item); for (let node = head;previous(). node.= head. node = node;previous()) { console.log(node;item); } console.log("----");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM