JavaScript | Как отзеркалить скобки?

Есть строка:

var stroka = "Mazda ]RX707[ - )легковой автомобиль(  }повышенного комфорта{"

Нам нужно перевернуть скобки, чтобы они смотрели в другую сторону. У нас в строке встречаются круглые, квадратные и фигурные скобки. Их нужно отзеркалить. Как это сделать?

Способ № 1 — при помощи переключателя switch, метода map и метода join

При любых раскладах нам сначала нужно раскидать каждый символ строки на отдельное значение элемента массива. Сделать это можно двумя способами:

[...stroka]
или
Array.from(stroka)

Эти вызовы вернут нам массив вида:

["M", "a", "z", "d", "a", " ", "]", "R", "X", "7", "0", "7", "[", " ", "-", " ", ")", "л", "е", "г", "к", "о", "в", "о", "й", " ", "а", "в", "т", "о", "м", "о", "б", "и", "л", "ь", "(", " ", " ", "}", "п", "о", "в", "ы", "ш", "е", "н", "н", "о", "г", "о", " ", "к", "о", "м", "ф", "о", "р", "т", "а", "{"]

Скрины из консоли браузера:

Строку в массив символов через оператор spread - JavaScript
Строку в массив символов через оператор spread — JavaScript
Строку в массив символов через метод from конструктора Array - JavaScript
Строку в массив символов через метод from конструктора Array — JavaScript

Нам в любом случае нужно получить массив из отдельных символов всей строки, чтобы при последовательном обходе в нужных местах производить замены. Для обхода мы будем использовать метод map().

Мы будем прогонять каждый элемент массива через функцию с переключателем. В функцию будет передаваться один символ.

switch (i) {
   case '(': return ')';
   case ')': return '(';
   case '[': return ']';
   case ']': return '[';
   case '{': return '}';
   case '}': return '{';
   default: return i;
}

Это может выглядеть так:

[...stroka].map(i=>{switch (i) { case '(': return ')'; case ')': return '('; case '[': return ']'; case ']': return '['; case '{': return '}'; case '}': return '{'; default: return i; }}).join("")

Но для красоты можно заранее подготовить функцию mirror_brackets(), чтобы внутри неё разместить всю логику замен.

function mirror_brackets(i) {
   switch (i) {
      case '(': return ')';
      case ')': return '(';
      case '[': return ']';
      case ']': return '[';
      case '{': return '}';
      case '}': return '{';
      default: return i;
   }
}

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

Использовали анонимный коллбек со switch внутри map - JavaScript
Использовали анонимный коллбек со switch внутри map — JavaScript

Выражение с методом map() будет выглядеть так:

[...stroka].map(mirror_brackets).join("")
"Mazda [RX707] - (легковой автомобиль)  {повышенного комфорта}"

Скрин:

Переключатель скобок положили в отдельную функцию - JavaScript
Переключатель скобок положили в отдельную функцию — JavaScript

Способ № 2 — при помощи массива и цикла

Функция отзеркаливания скобок в строке

function reverseBrackets (str){
   for(arr=[...str], newarr=[], i=0; i<arr.length; i++){
           if(arr[i]=="["){newarr.push("]")}
      else if(arr[i]=="]"){newarr.push("[")}
      else if(arr[i]=="("){newarr.push(")")}
      else if(arr[i]==")"){newarr.push("(")}
      else if(arr[i]=="{"){newarr.push("}")}
      else if(arr[i]=="}"){newarr.push("{")}
      else{newarr.push(arr[i])}
   }
return newarr.join("")
}

Функция превращает строку в массив и по каждому элементу делает проверку на наличие скобок. Если на текущей позиции счётчика нет скобки, тогда такой элемент просто добавляется в новый массив без изменений. Если есть какая-либо скобка, тогда она переворачивается и в новый массив возвращается перевёрнутая версия скобки.

 

Пример работы функции

Функция отзеркаливания скобок в строке - JavaScript
Функция отзеркаливания скобок в строке — JavaScript

 

 

Информационные ссылки

JavaScript | Оператор for

Стандарт ECMAScript — Раздел «14.12 The switch Statement» — https://tc39.es/ecma262/#sec-switch-statement

Стандарт ECMAScript — Раздел «14.7.4 The for Statement» — https://tc39.es/ecma262/#sec-for-statement

Поделись записью