Структуры в JavaScript

Обновление 8 мая 2022 года:

Если вы хотите использовать его, я только что опубликовал его как пакет npm.

npm i makestruct

Что такое структура?

Структура используется для построения структур данных. Эти структуры используются для группировки связанных данных вместе.

Есть различия в том, как они работают за кулисами в зависимости от языка программирования, но самое интересное, что в JavaScript нет структур.

Когда вы хотите создать пользовательскую структуру данных в JS, вы обычно делаете одну вещь. Создание объекта.

const user = {
  id: 0,
  name: '',
  country: '',
  pets: [],
}
Вход в полноэкранный режим Выход из полноэкранного режима

Но есть ли другой способ сделать это?

Давайте попробуем создать функцию для динамической генерации “структур” в JavaScript!

/**
 * @constructor Generates a constructor for a given data structure
 * @param {string} keys separated by a comma + whitespace. struct('id, name, age')
 * @returns {constructor} Constructor for the new struct
 */
function makeStruct(keys) {
  if (!keys) return null;
  const k = keys.split(', ');
  const count = k.length;

  /** @constructor */
  function constructor() {
    for (let i = 0; i < count; i++) this[k[i]] = arguments[i];
  }
  return constructor;
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Как это работает?

Она принимает строку, разделенную запятыми и пробелами, и генерирует конструктор для нужной вам структуры, так что теперь вы можете создавать свои объекты, используя этот динамически сгенерированный конструктор.

Использование:

const user = new makeStruct("id, name, country");
const johnny = new user(1, 'John', 'UK');
console.log(johnny.name); // john
Войти в полноэкранный режим Выход из полноэкранного режима

Мы также можем назначать сложные структуры в наших свойствах!

const user = new makeStruct("id, name, country, pets");
const pepe = new user(1, 'Pepe', 'ES', ['Baxter', 'Flurfrils']);

console.log(pepe.pets); // ['Baxter', 'Flurfrils']
Войти в полноэкранный режим Выйти из полноэкранного режима

Или добавить одну структуру внутрь другой:

/**
 * @typedef UserInfo
 * @property {string} phone
 * @property {number} age
 * @property {string} hairColor
 * @constructor
 */

/** @type {ObjectConstructor|any} */
const UserInfo = new makeStruct('phone, age, hairColor');

/** @type {UserInfo} */
const extraInfo = new UserInfo('555-777-888', 31, 'blonde');


/**
 * @typedef User
 * @property {number} id
 * @property {string} name
 * @property {string} country
 * @property {UserInfo} info
 * @constructor
 */

/** @type {ObjectConstructor|any} */
const User = new makeStruct('id, name, country, info');
/** @type {User} */
const John = new User(1, 'John', 'US', extraInfo);
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь мы можем сделать:

John.country // 'US'
John.info.phone // '555-777-888'
Войти в полноэкранный режим Выйти из полноэкранного режима

Ладно, ладно, в конце создается объект, но JavaScript – это объектно-ориентированный язык, как и Python и другие, так что на самом деле все является объектом.

И вы не можете сказать, что это не смешно!


Вам нравится мой контент?

Оцените статью
Procodings.ru
Добавить комментарий