Я работаю с Map
в JavaScript и столкнулся с проблемой. Мне нужно получить элемент из Map
, а если его нет - добавить начальное значение. При этом я хочу использовать const
для локальных переменных.
Сейчас я делаю так:
const item = myMap.has(key) ? myMap.get(key) : myMap.set(key, createInitialValue()).get(key);
Или вот так, чтобы избежать вызова .get()
сразу после .set()
:
const item = myMap.has(key) ? myMap.get(key) : (() => {
const value = createInitialValue();
myMap.set(key, value);
return value;
})();
Эти варианты кажутся мне слишком громоздкими. Есть ли более простой способ получить элемент из Map
в const
переменную, автоматически добавляя его, если он отсутствует? Буду благодарен за подсказки!
слушай, а может попробовать метод .setDefault()? он как раз для таких случаев придуман. выглядит это примерно так:
const item = myMap.setDefault(key, createInitialValue());
этот метод сам проверит есть ли значение по ключу, если нет - создаст новое используя переданную функцию, а потом вернет значение. получается коротко и ясно, без лишних проверок. я сам недавно узнал про такую фишку, может и тебе пригодится
Для такого сценария отлично подойдет метод Map.prototype.get() с дефолтным значением. Вот как это можно сделать:
const item = myMap.get(key) ?? myMap.set(key, createInitialValue()).get(key);
Этот подход короче и читабельнее. Он использует оператор нулевого слияния (??) для проверки наличия значения. Если значение не найдено, мы устанавливаем новое и сразу его возвращаем. Такой код более лаконичный и выразительный, чем предыдущие варианты.
А вы пробовали использовать метод .getOrDefault()? Он как раз для таких случаев. Например:
const item = myMap.getOrDefault(key, createInitialValue());
Этот метод сам проверит, есть ли значение по ключу, и если нет - создаст новое. Просто и понятно, без лишнего кода. Как вам такой вариант?