Удалить текст, пробел, следующий за маркером комментария в строке с помощью JavaScript - создать новую строку в строке - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь решить этот CodeWars вызов:

Завершите решение так, чтобы оно удаляло весь текст, который следует за любым из переданных наборов маркеров комментариев. Любые пробелы в конце строки также должны быть удалены.

С учетом входной строки:

apples, pears # and bananas
grapes
bananas !apples

Ожидаемый результат будет:

apples, pears
grapes
bananas

Пока я пробовал:

function solution(input, markers) {

  let string = input.split();
  let newString = " ";

  for (let i = 0; i < string.length; i++) {

    let words = string[i];
    //console.log(words);

    if (words.includes(markers || "/n")) {
      //go to the next line and keep building newString
    }
    newString += words;
  }
  return newString.toString();
}

И это возвращает apples,pears#andbananas/ngrapes/nbananas!apples, потому что, как вы можете видеть, я не знаю, как создать новую строку в строке, когда присутствует один из маркеров или когда присутствует /n.

Я пробовал

if (words.includes(markers || "/n")) {
  //go to the next line and keep building newString
  newString += "\n";
}

и

if (words.includes(markers || "/n")) {
  //go to the next line and keep building newString
  words + "\n";
}

но ни один из них не имеет никакого эффекта.

1 Ответ

4 голосов
/ 05 апреля 2019

Сайты с проблемами кодирования часто имеют уровни (например, CodeWars). В этом случае я бы посоветовал придерживаться более простых уровней немного дольше, пока вы не начнете свободно их решать.

Также проверьте решения, представленные другими: из этого можно многому научиться.

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

Некоторые комментарии к вашему коду:

  • Вы инициализируете свой newString пробелом. Это неправильное начало. Это пространство не гарантировано, чтобы быть там. Вы должны брать только символы из ввода. Это должна быть пустая строка.
  • Символ новой строки не "/n", а "\n"
  • input.split() преобразует строку в массив символов. Если ваша цель состояла в том, чтобы сделать возможным доступ к символам посредством индексации, то поймите, что вы можете сделать это и со строкой: input[i] дает вам символ с этим смещением.
  • Имена переменных важны. Наименование переменной string не очень полезно. Также не words, когда на самом деле он содержит один символ. Так что character будет лучшим выбором.
  • includes ожидает строку в качестве аргумента, но вы передаете markers. || "/n" не имеет никакого дополнительного значения, потому что markers является истинным значением, и поэтому || сразу же остановится (оценка короткого замыкания). И поскольку markers является массивом, а не строкой, includes преобразует это значение в строку через запятую. Очевидно, что эта строка очень редко встречается в вашем входе. Вам необходимо проверить каждый маркерный символ отдельно, а также проверить наличие символа новой строки.
  • Тело вашего оператора if пусто (в вашей основной попытке). Это не может быть полезным. Возможно, вы искали continue;, который пропустит оставшуюся часть цикла и продолжит следующую итерацию.
  • Не предусмотрено пропускать символы, за которыми следует маркерный символ.
  • У вас нет условий для устранения пробелов перед знаком маркера.
  • newString - строка, поэтому нет необходимости вызывать newString.toString();

Пытаясь придерживаться своей идеи, ваш код исправлен:

function solution(input, markers) {
  let newString = "";
  for (let i = 0; i < input.length; i++) {
    let character = input[i];
    if (markers.includes(character)) {
        // move i to just before the end of the current line
        i = input.indexOf("\n", i)-1;
        // Remove the white space that we already added at the end
        newString = newString.trimRight();
        // If no newline character at end of last line: break
        if (i < 0) break;
        // Skip rest of this iteration
        continue;
    }
    newString += input[i];    
  }
  return newString;
}

Но есть более простые способы сделать это. Например, сначала разбив ваш ввод на строки.

Вот решение, которое я выложил:

const solution = (input, markers) =>
    input.split("\n").map(line => 
        markers.reduce((line, marker) => 
            line.split(marker, 1)[0].trimRight(), line)).join("\n");  
...