Декодер повторений в строке
Иногда замечаю в решениях некоторых задач довольно странную конструкцию:
Object[key] = (Object[key] || 0) + 1;
И вот она вновь попалась при решении очередной задачи, суть которой звучит так:
Переработайте строку так, чтобы каждый уникальный её элемент был обозначен "(", а повторения ")".
Парочка примеров:
"din" => "((("
"recede" => "()()()"
Собственно, решение, которое меня смутило:
const duplicateEncode = (word) => {
let letterCount = {};
let letters = word.toLowerCase().split("");
letters.forEach((letter) => {
letterCount[letter] = (letterCount[letter] || 0) + 1;
});
return letters.map((letter) => {
if (letterCount[letter] === 1) {
return "(";
} else {
return ")";
}
}).join("");
};
Что происходит в этой строке letterCount[letter] = (letterCount[letter] || 0) + 1;? В Объекте letterCount устанавливается ключ letter но что означает его значение? Не понимаю как это работает. Видел в консоли, мол в качестве ключа устанавливается сам символ, а значением его количество повторений. Опять же, я не понимаю как так получилось. Помогите проанализировать данный момент, заранее спасибо.
Ответы (1 шт):
Строка letterCount[letter] = (letterCount[letter] || 0) + 1; примерно равна:
if (letterCount[letter] != undefined)
letterCount[letter] = letterCount[letter] + 1;
else
letterCount[letter] = 0 + 1;
т.е. она позволяет создать сзачение по-умолчанию, если у нас letterCount[letter] не существует, чтобы не получать NaN пытаясь сложить undefined + 1.
Это работает потому что в JS оператор || возвращает значение операнда (а не результат его конвертирования в bool), который истинный (== true, != null, != undefined, != 0), т.е. в выражении letterCount[letter] || 0 если левая часть истинна (!= undefined), то будет возвращен результат letterCount[letter], если нет, то 0 (Logical Operators).