Как реализовать публичный статический метод fromIterable(iterable) для класса Stack
Необходимо реализовать статический публичный метод:
- fromIterable(iterable) - возвращает новый Stack, элементами которого служат элементы переданной итерируемой сущности. Максимальное количество элементов такого стека должно быть равно длине этой сущности. Если сущность не является итерируемой генерировать ошибку.
Мой код:
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.items.length === 0) throw new Error('Error');
return this.items.pop();
}
peek() {
if (this.length === 0) return null;
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}
let myStack = new Stack()
Ответы (1 шт):
Автор решения: EzioMercer
→ Ссылка
Можно сделать так:
class Stack {
constructor() {
this.items = [];
this.maxItemsCount = Infinity;
}
static fromIterable(obj) {
const stack = new Stack();
for(const item of obj) stack.push(item);
stack.maxItemsCount = obj.length;
return stack;
}
push(element) {
if (this.items.length + 1 > this.maxItemsCount) {
console.log('Reached max size of stack!');
return;
}
this.items.push(element);
}
pop() {
if (this.items.length === 0) throw new Error('Error');
return this.items.pop();
}
peek() {
if (this.length === 0) return null;
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}
console.log(Stack.fromIterable('25'));
const stack = Stack.fromIterable([1, 2, 3]);
console.log(stack);
stack.push(4);
stack.pop();
stack.push(4);
stack.push(5);
console.log(stack);
console.log(Stack.fromIterable(2));
Проверка на итерируемость взята из доков https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Iteration_protocols
Но лично я бы это сделал просто передачей объкта напрямую в конструктор, мне кажется так логичнее и чище:
class Stack {
#maxItemsCount = Infinity;
constructor(obj) {
this.items = [];
if (obj === undefined) return;
for(const item of obj) this.items.push(item);
this.#maxItemsCount = obj.length;
}
push(element) {
if(this.items.length + 1 > this.#maxItemsCount) {
console.log('Reached max size of stack!');
return;
}
this.items.push(element);
}
pop() {
if (this.items.length === 0) throw new Error('Error');
return this.items.pop();
}
peek() {
if (this.length === 0) return null;
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}
console.log(new Stack('25'));
const stack = new Stack([1, 2, 3]);
console.log(stack);
stack.push(4);
stack.pop();
stack.push(4);
stack.push(5);
console.log(stack);
console.log(new Stack());
console.log(new Stack(2));