upsert для объекта Map
функция upsert для объекта Map - кандидат в новые элементы синтаксиса JavaScript
Сегодня мы поговорим о преимуществах и особенностях потенциально новой функции upsert
для объекта Map в JavaScript.
Итак, что такое Map
в JavaScript?
Map
- структура данных, о которой Вы, возможно, даже не слышали. Скорее всего Вы ассоциируете понятие map
с Array.prototype.map
.
Но Map
- нечто другое, в JavaScript это объект, который хранит пары ключ-значение.
Минуточку… в чем же различия Map
и Object
.
Несомненно, Map
и Object
имеют некоторые сходства. И нет ничего странного в том, что до появления в синтаксисе JavaScript стандартного встроенного объекта Map
, его функции выполнял Object
.
Тем не менее, Map
имеет ряд отличий. В том числе:
-
Map
не имеет прототипов, поэтому у данного объекта не будет никаких ключей, пока Вы их не заведете, - ключом объекта
Map
может быть что угодно, в том числе функции, объекты и примитивы, -
Map
запоминает последовательность вставки ключей, иными словами ключи вMap
упорядочены, - Количество элементов
Map
легко получить с помощью свойстваsize
, -
Map
является итерируемым объектом, -
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
получает на входе три аргумента:
- ключ целевого элемента,
- функция, которая будет выполнена, если элемент существует,
- функция, которая будет выполнена, если элемент не существует.
Таким образом, пример, приведенный выше, получит следующий синтаксис:
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!”.