При впушивании строки в массив, выводит undefined

Пользуясь случаем хочу спросить мнение о решении задачки - "Ввести с клавиатуры текст предложения, завершить точкой. Сформировать новую строку на основе исходной, в которой после каждого слова в скобках указать номер слова в предложении (слова разделяются запятыми, пробелами или тире). Например, если введено «Донецк – прекрасный город», результирующая строка должна выглядеть так: «Донецк(1) – прекрасный(2) город(3)».

Хочу выводить слова в массив а потом брать их из массива и соединять с каким то countom в строке, есть ли решение получше? Надо решать через обработку строки как массива!!!

А вот собственно сам код, почему вместо строк, слов. В массиве появляется undefined? как исправить такое поведение?

let prom = "Донецк - прекрасный город";


function asd(prom) {
  var arr2 = [];

  for (i = 0; i < prom.length; i++) {
    let count = 0
    if (prom[i] == " ") {
      arr2.push(prom[count - i])
      count = i
    }

  }
  return arr2
}

console.log(asd(prom))


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

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

undefined потому что count - i уходит в минус соответственно по отрицательному индексу в строке нет значения.

let prom = "Донецк - прекрасный, город";
let n = 1;
function asd(prom) {
  let m = prom.split(" ")
  let res = m.map((e,i)=>{
    let nn = n;
    if(e.includes("-")) {
      return e
    }
    if(e.includes(",")){
      n++;
      return  `${e.slice(0,e.length-1)}(${nn})${e[e.length-1]}`;
    }    
    if(!e.includes("-")){
      n++;
      return  `${e}(${nn})`
    }
  })
  return res.join(" ")
}

console.log(asd(prom))

→ Ссылка
Автор решения: Grundy
  1. на каждой итерации цикла обнуляется count, поэтому индекс всегда отрицательный, и, следовательно результат prom[count - i] - undefined
  2. prom[count - i] - это получение одной буквы, а не подстроки. Для получения подстроки можно воспользоваться методом .slice либо .substring
  3. алгоритм может выглядеть следующим образом:
    1. пробег по символам строки
    2. если символ - разделитель и предыдущий символ был буквой - добавляем в результат номер слова
    3. добавляем в результат текущий символ

let prom = "Донецк - прекрасный город";


function asd(prom) {
  var count = 1;
  var res = '';
  for (i = 0; i < prom.length; i++) {
    if ((prom[i] == " " || prom[i] == "-") && // проверяем разделители
      prom[i - 1].match(/\p{Alpha}/iu)) { // проверяем что предыдущий символ - буква
      res += '(' + count + ')';
      count += 1;
    }
    res += prom[i];
  }
  if (prom[prom.length - 1].match(/\p{Alpha}/iu)) { // если последний символ был буквой - учитываем последнее слово
    res += '(' + count + ')';
  }
  return res;
}

console.log(asd(prom))

→ Ссылка