Преобразовать строку согласно регистрам

Задача такая. Получаем строку 'nameSname' => 'name-s-name'. Я получаю строку - ищу символ большого регистра, делаю действия:

  1. Большую букву - делаю её маленькой
  2. Перед символом ставлю "-"
  3. После символе ставлю "-"

let strReform = 'camelsHaveThreeHumps'
let splitStrReform = strReform.split('')
const arr = []

const finalHubps = arr.map((arr, i) => {
  if (arr === arr.toUpperCase()) {
    arr.toLowerCase()
    arr[i + 1] === '-'
    arr[i - 1] === '-'
  }
})
console.log(finalHubps)

Спасибо заранее.


Ответы (2 шт):

Автор решения: Igor

let strReform = 'camelsHaveThreeHumps';
const arr = strReform.split('');

const finalHubps = arr.map(a => a == a.toUpperCase() ? `-${a.toLowerCase()}-` : a);

console.log(finalHubps.join(''));

→ Ссылка
Автор решения: Grundy

Основная проблема в именах переменных. Из-за одинаковых имен, происходит путаница, где просто строка, а где массив строк.

Следующая проблема: все методы строк не изменяют исходную строку, а возвращают новую, поэтому нужно куда-то присваивать результат вызова, или использовать его в каком либо выражении.

И наконец, метод .map ставит в соответствие каждому элементу одного массива, элемент из другого. Новый элемент должен возвращаться из переданного callback, но сейчас ничего не возвращается.

Кроме того, нужно не забыть собрать полученный массив обратно в строку с помощью метода .join

Если все исправить, можно получить следующее:

let strReform = 'camelsHaveThreeHumps'
let splitStrReform = strReform.split('')

const finalHubps = splitStrReform.map((str, i) => {
  if (str === str.toUpperCase()) {
    return '-' + str.toLowerCase() + '-';
  }
  return str;
}).join('');
console.log(finalHubps)


Альтернативным решением может стать использование регулярного выражения, в методе .replace

let strReform = 'camelsHaveThreeHumps'

const finalHubps = strReform.replace(/[A-Z]/g, _ => `-${_.toLowerCase()}-`);
console.log(finalHubps)

→ Ссылка