在做 Array.from 时让我的 class return 数组

Let my class return array when doing Array.from

我有一个 PriorityQueue class,它有很多方法,例如 add、peak、changePriority 等。所以要实例化 class 我们有:

let priorityQueue = new PriorityQueue();

要向 PriorityQueue 实例添加内容,我可以这样做:

priorityQueue.add(10, 1);
priorityQueue.add(100, 0);
priorityQueue.add(200, 0);

我的问题是我们该怎么做

Array.from(priorityQueue)

所以 returns [100, 200, 10]?

这是我的完整代码:

class QElement { 
    constructor(element, priority) 
    { 
        this.element = element; 
        this.priority = priority; 
    } 
} 
  
class PriorityQueue extends Array{ 
  
    // An array is used to implement priority 
    constructor() 
    { 
        super()
        this.items = []; 
    } 
    add(value, priority) 
    { 
        // creating object from queue element 
        var qElement = new QElement(value, priority); 
        var contain = false; 
      
        // iterating through the entire 
        // item array to add element at the 
        // correct location of the Queue 
        for (var i = 0; i < this.items.length; i++) { 
            if (this.items[i].priority > qElement.priority) { 
                // Once the correct location is found it is 
                // enqueued 
                this.items.splice(i, 0, qElement); 
                contain = true; 
                break; 
            } 
        } 
      
        // if the element have the highest priority 
        // it is added at the end of the queue 
        if (!contain) { 
            this.items.push(qElement); 
        } 
    }
    
    poll() 
    { 
        // return the dequeued element 
        // and remove it. 
        // if the queue is empty 
        // returns Underflow 
        if (this.isEmpty()) 
            return "Underflow"; 
        return this.items.shift(); 
    } 
    
    peak() 
    { 
        // returns the highest priority element 
        // in the Priority queue without removing it. 
        if (this.isEmpty()) 
            return "No elements in Queue"; 
        return this.items[0]; 
    } 
    
    rear() 
    { 
        // returns the lowest priorty 
        // element of the queue 
        if (this.isEmpty()) 
            return "No elements in Queue"; 
        return this.items[this.items.length - 1]; 
    }
    
    printPQueue() 
    { 
        var str = ""; 
        for (var i = 0; i < this.items.length; i++) 
            str += this.items[i].element + " "; 
        return str; 
    } 
}

var priorityQueue = new PriorityQueue();

priorityQueue.add(10, 1);
priorityQueue.add(100, 0);
priorityQueue.add(200, 0);
priorityQueue.printPQueue()
let ppp = Array.from(priorityQueue)
console.log(ppp)

这应该 return [100, 200, 10],但它 returned [],一个空数组。

我必须严格使用Array.from。解决方案是什么?

你可以使用 Symbol.iterator.

在下面的代码片段中,我省略了任何优先级队列逻辑,只是使用 sort 来演示如何使用该生成器:

class PriorityQueue {
    constructor() {
        this.arr = [];
    }
    add(data, priority) {
        this.arr.push({ data, priority });
    }
    * [Symbol.iterator]() {
        yield * [...this.arr].sort((a, b) => a.priority - b.priority).map(a => a.data);
    }
};

let priorityQueue = new PriorityQueue();
priorityQueue.add(10, 1);
priorityQueue.add(100, 0);
priorityQueue.add(200, 0);
console.log(Array.from(priorityQueue));

编辑后

您添加到问题中的代码显示错误。尽管您扩展了 Array,但您从未使用过实例的 Array 功能。您的代码继续运行,就好像它没有继承那些代码,而是创建一个名为 items 的数组 属性。当您将项目推送到 items 属性 时,this 对象将保持为空数组,这是可以预料的。如果你想使用 extends 那么你应该在某处调用 this.push(value)this.pop()this.splice(.....)