在做 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(.....)
。
我有一个 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(.....)
。