Как реализовать публичный статический метод 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));

→ Ссылка