dr.Brain

doctor Brain

мир глазами веб-разработчика

upsert для объекта Map

функция upsert для объекта Map - кандидат в новые элементы синтаксиса JavaScript

dr.Brain

время чтения 3 мин.

Photo by Quentin Kemmel on Unsplash

Сегодня мы поговорим о преимуществах и особенностях потенциально новой функции upsert для объекта Map в JavaScript.

Итак, что такое Map в JavaScript?

Map - структура данных, о которой Вы, возможно, даже не слышали. Скорее всего Вы ассоциируете понятие map с Array.prototype.map.

Но Map - нечто другое, в JavaScript это объект, который хранит пары ключ-значение.

Минуточку… в чем же различия Map и Object.

Несомненно, Map и Object имеют некоторые сходства. И нет ничего странного в том, что до появления в синтаксисе JavaScript стандартного встроенного объекта Map, его функции выполнял Object.

Тем не менее, Map имеет ряд отличий. В том числе:

  1. Map не имеет прототипов, поэтому у данного объекта не будет никаких ключей, пока Вы их не заведете,
  2. ключом объекта Map может быть что угодно, в том числе функции, объекты и примитивы,
  3. Map запоминает последовательность вставки ключей, иными словами ключи в Map упорядочены,
  4. Количество элементов Map легко получить с помощью свойства size,
  5. Map является итерируемым объектом,
  6. Map демонстрирует лучшую производительность при частом добавлении и удалении пар ключ-значение.

Итак, Вы можете создать экземпляр объекта Map и добавить элемент (пару ключ-значение) с помощью функции set:

let example = new Map();
example.set('test', 'value');

Теперь, если Вы захотите добавить элемент с таким же ключом, значение будет просто переписано:

example.set('test', true);

Таким образом, в случае, когда Вам нужно организовать взаимодействие с определенным элементом, первоначально нужно убедиться в его существовании, добавить элемент, если он отсутствует, и только после этого проводить необходимые манипуляции:

if (!example.has('test')) {
  example.set('test', 'new value')
}
example.get('test').myFunctionForMessingWithThisKeyEntry()

И это не единственная ситуация. Вы можете захотеть добавить элемент только в том случае, когда он отсутствует, или обновить значение элемента, если он был уже объявлен ранее.

Было бы неплохо иметь инструмент, позволяющий сразу выполнять проверку существования элемента с определенным ключом.

Именно для таких целей предложена функция upsert для объекта Map.

upsert получает на входе три аргумента:

  1. ключ целевого элемента,
  2. функция, которая будет выполнена, если элемент существует,
  3. функция, которая будет выполнена, если элемент не существует.

Таким образом, пример, приведенный выше, получит следующий синтаксис:

example
  .upsert('test', undefined, () => 'new value')
  .myFunctionForMessingWithThisKeyEntry()

undefined в данном случае означает, что мы ничего не делаем, если элемент уже существует.

Еще один пример:

example.upsert('test', old => old.someOperation(), undefined)

В этом примере old соответствует map.get('test'). Действие осуществляется, если элемент был добавлен ранее. Если элемент с данным ключом не существует, ничего не происходит.

Таким образом, upsert упрощает понимание написанного кода и имеет множество вариантов применения.

На данный момент функция upsert для объкта Map находится на 2 стадии процесса ТС39. Вы можете принять участие в обсуждении этой функции в соответствующем репозитарии.


Спасибо за внимание.


Написано по материалам статьи Laurie “JavaScript Map is getting upsert!”.

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.