删除字符串中带有 JavaScript 的注释标记后面的白色文本 Space - 在字符串中创建新行
Remove Text, White Space That Follows Comment Marker in String With JavaScript - Create New Line In String
我正在尝试解决 this CodeWars 挑战:
Complete the solution so that it strips all text that follows any of a set of comment markers passed in. Any whitespace at the end of the line should also be stripped out.
Given an input string of:
apples, pears # and bananas
grapes
bananas !apples
The output expected would be:
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";
}
但这些都没有任何效果。
具有编码挑战的站点通常有级别(如 CodeWars)。在这种情况下,我建议您在较简单的关卡上坚持更长的时间,直到您真正熟练地解决它们为止。
也看看其他人提交的解决方案:可以从中学到很多。
我这么说是因为您的代码中有太多错误,与仅仅在此处获取解决方案并发布相比,您似乎可以从更简单的关卡中获益更多。
对您的代码的一些评论:
- 你用 space 初始化你的
newString
。那是一个错误的开始。 space 不一定在那里。您应该只从输入中获取字符。它应该是一个空字符串。
- 换行符不是
"/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");
我正在尝试解决 this CodeWars 挑战:
Complete the solution so that it strips all text that follows any of a set of comment markers passed in. Any whitespace at the end of the line should also be stripped out.
Given an input string of:
apples, pears # and bananas grapes bananas !apples
The output expected would be:
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";
}
但这些都没有任何效果。
具有编码挑战的站点通常有级别(如 CodeWars)。在这种情况下,我建议您在较简单的关卡上坚持更长的时间,直到您真正熟练地解决它们为止。
也看看其他人提交的解决方案:可以从中学到很多。
我这么说是因为您的代码中有太多错误,与仅仅在此处获取解决方案并发布相比,您似乎可以从更简单的关卡中获益更多。
对您的代码的一些评论:
- 你用 space 初始化你的
newString
。那是一个错误的开始。 space 不一定在那里。您应该只从输入中获取字符。它应该是一个空字符串。 - 换行符不是
"/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");