Я хочу, чтобы при создании экземпляра класса TableCategory объект был создан с использованием данных, переданных при создании экземпляра. Я хочу, чтобы это происходило автоматически в ...

0
thomasbishop 3 Мар 2021 в 19:19

2 ответа

Лучший ответ

forEach() ничего не возвращает. Создайте пустой объект categoryData, а затем заполните его в цикле forEach.

Кроме того, вам необходимо использовать стрелочную функцию, чтобы иметь доступ к this в функции обратного вызова.

class TableCategory {
  constructor(categoryValues = []) {
    this.categoryValues = categoryValues;
    this.categoryKeys = ['alpha', 'beta', 'gamma', 'delta'];
    this.categoryData = {};
    this.categoryKeys.forEach((key, i) =>
      this.categoryData[key] = this.categoryValues[i]
    )
  }
}

const foo = new TableCategory(['a', 'b', 'c', 'd']);
console.log(foo.categoryData.beta); // b
1
Barmar 3 Мар 2021 в 16:25

forEach не возвращает ничего, кроме undefined. Вы все еще можете получить желаемый объект функциональным способом, но с Object.fromEntries.

Кроме того, поскольку вы говорите, что используете класс, потому что намереваетесь изменить экземпляры с помощью геттеров и сеттеров, я не думаю, что было бы хорошей идеей по-прежнему хранить значения и ключи отдельно от третьего свойства, которое имеет все информация о ключах и значениях.

Например, вы можете сделать это:

class TableCategory {
  constructor(values = []) {
    this._obj = Object.fromEntries(['alpha','beta','gamma', 'delta']
                      .map((key, i) => [key, values[i]]));
  }
  get values() {
      return Object.values(this._obj);
  }
  get keys() {
      return Object.keys(this._obj);
  }
}

let obj = new TableCategory(["this", "is", "a", "test"]);

console.log(obj.values);
1
trincot 3 Мар 2021 в 16:47