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

В этой статье мы рассмотрим некоторые решения распространенных проблем с JavaScript.

Цель требования

require не входит в стандартный API.

Он используется для импорта членов из других модулей в Node.js.

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

Есть разница между структурой приложений браузера и Node.

Браузерные приложения загружаются из тегов скриптов.

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

В приложениях Node каждый модуль имеет свою область действия. К элементам в группе можно получить доступ, если они не экспортированы с помощью modulee.exports или exports и не требуются.

Для импорта модуля мы используем функцию require.

Мы можем потребовать модули из нашего собственного приложения или запросить пакеты от Node.

Большинство пакетов Node устанавливаются из NPM.

Пакеты находятся в папке node_modules.

Проверить, пуст ли объект

Есть несколько способов проверить, пуст ли объект.

Например, мы можем написать:

obj === null

чтобы проверить, является ли объект null.

Мы также можем написать:

typeof obj !== 'object'

чтобы проверить, не является ли obj объектом.

Кроме того, мы можем использовать getOwnPropertyNames, чтобы получить ненаследуемые имена строковых свойств объекта в виде массива.

Итак, мы можем написать:

Object.getOwnPropertyNames(obj).length === 0

чтобы проверить, что возвращенный массив пуст.

Кроме того, мы можем использовать Object.keys, чтобы сделать то же самое:

Object.keys(obj).length === 0

Сгруппируйте массив объектов по их ключу

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

Затем мы получаем записи массива из свойства со значением в с заданным ключом в объекте.

Например, мы можем написать:

const groupBy = (items, key) => items.reduce(
  (result, item) => ({
    ...result,
    [item[key]]: [
      ...(result[item[key]] || []),
      item,
    ],
  }), 
  {},
);

Теперь у нас есть такой массив:

const arr = [{
    foo: 'dog',
    bar: 2
  },
  {
    foo: 'cat',
    bar: 2
  },
  {
    foo: 'dog',
    bar: 3
  },
  {
    foo: 'cat',
    bar: 4
  },
]

Мы можем вызвать метод groupBy, написав:

const result = groupBy(arr, 'foo');

Тогда result будет:

{
  "dog": [
    {
      "foo": "dog",
      "bar": 2
    },
    {
      "foo": "dog",
      "bar": 3
    }
  ],
  "cat": [
    {
      "foo": "cat",
      "bar": 2
    },
    {
      "foo": "cat",
      "bar": 4
    }
  ]
}

Мы сгруппировали наш массив по свойству foo.

И значение каждого ключа - это массив с записями со значением foo, заданным ключом.

Разделить строку несколькими разделителями

Мы можем использовать метод split с регулярным выражением со всеми разделителями, которые мы хотим сопоставить, чтобы разделить строку по всем перечисленным разделителям.

Например, мы можем написать:

"foo bar, baz".split(/[\s,]+/)

Тогда получаем:

["foo", "bar", "baz"]

Поскольку у нас есть образец пробела и запятая в регулярном выражении.

Разница между методом класса и методом прототипа класса

Есть различия между:

Class.method = function () { 
  //...
}

а также:

Class.prototype.method = function () {
  //...
}

Class.method означает, что method метод является статическим методом Class.

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

Например, мы можем написать:

Class.method();

С другой стороны, Class.prototype.method - это метод экземпляра Class.

Это означает, что мы должны создать экземпляр Class, чтобы использовать его.

Например, мы можем написать:

const obj = new Class();

Затем вызываем Class.prototype.method, написав:

obj.method();

Получите расширение файла по имени файла

Если у нас есть строка имени файла, мы можем вызвать split, чтобы разделить имя файла точкой, чтобы получить имя и расширение файла.

Последняя запись возвращенного массива будет расширением.

Итак, мы можем написать:

const ext = filename.split('.').pop();

Мы вызываем pop, чтобы вернуть последнюю запись массива, возвращенного split, чтобы получить расширение.

Заключение

Мы можем получить расширение файла из имени файла, используя split.

Есть разница между методами, прикрепленными к prototype, и методами, которые прикреплены непосредственно к классу.

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