MST

星途 面试题库

面试题:JavaScript可迭代对象在自定义数据结构中的应用

设计一个简单的自定义数据结构(如链表),使其成为可迭代对象。实现迭代功能,使得能够按顺序访问链表中的每一个节点的值。请给出JavaScript代码实现,并解释如何使该数据结构符合可迭代协议,以及这种设计在实际应用中的优势。
27.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

JavaScript代码实现

class ListNode {
    constructor(value) {
        this.value = value;
        this.next = null;
    }
}

class LinkedList {
    constructor() {
        this.head = null;
    }

    addNode(value) {
        const newNode = new ListNode(value);
        if (!this.head) {
            this.head = newNode;
        } else {
            let current = this.head;
            while (current.next) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    [Symbol.iterator]() {
        let current = this.head;
        return {
            next() {
                if (current) {
                    const value = current.value;
                    current = current.next;
                    return { done: false, value };
                } else {
                    return { done: true };
                }
            }
        };
    }
}

如何使该数据结构符合可迭代协议

在JavaScript中,一个对象要成为可迭代对象,需要实现Symbol.iterator方法。在上述代码中,LinkedList类实现了Symbol.iterator方法。这个方法返回一个迭代器对象,该迭代器对象有一个next方法。每次调用next方法时,它会返回一个包含donevalue属性的对象。done表示迭代是否结束,value表示当前迭代的值。通过这种方式,LinkedList实例就成为了可迭代对象,可以使用for...of循环等迭代机制。

这种设计在实际应用中的优势

  1. 代码简洁:使用可迭代对象,在遍历链表时可以使用for...of循环等简洁的语法,提高代码可读性和编写效率。例如:
const list = new LinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);

for (const value of list) {
    console.log(value);
}
  1. 可组合性:可迭代对象可以方便地与其他支持迭代协议的函数或库进行组合。例如,可以使用Array.from将链表转换为数组,或者使用mapfilter等数组方法对链表数据进行处理。
const list = new LinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);

const arrayFromList = Array.from(list);
const filteredList = Array.from(list).filter(value => value > 1);
  1. 延迟计算:迭代器实现的延迟计算特性,使得在处理大型链表时,可以按需获取数据,而不是一次性加载所有数据,从而提高内存使用效率。