我正在做一个项目,将一个简单的句子转换为"青少年"会说的语句。我想在用户输入的句子中的每三个单词后面添加短语"you know"。当我在末尾打印转换后的句子时,我的数组中的每一个项目(或单词)似乎都有一个额外的"you know"。我怎么才能失去最后所有多余的"你知道"?或者我该如何防止这种情况发生?这是我的代码:
var k = 3;
var phrase = "you know";
var sentence = prompt("Enter a sentence: ");
sentence = sentence.split(" ");
for (word in sentence) {
sentence.splice(k, 0, phrase);
k += 4;
}
sentence = sentence.join(" ");
alert(sentence);
对于中的vs
当您想迭代可迭代对象(如数组)中的每个项时,应该使用for (let x of arr) ...
而不是for (let x in arr)
。后者用于迭代对象中的每个键,包括原型继承的键。
更改您迭代的内容
你在迭代一件事的同时又在修改它,这总是一个让人头疼的好方法。如果要在遍历数组时对其进行增量变异,请先创建一个副本:var newSentence = sentence.slice()
,然后修改它。事实上,您甚至不需要迭代数组,因为。。。
太多"你知道">
你的逻辑有点偏离。对于一个N字的句子,你准确地输入了N次"你知道";只有当你想要每个单词都有一个"你知道"时,这才有意义。如果你想每4个单词插入一次,你需要插入N/4次。你需要的是在你还没有跑过句子末尾的时候继续插入:
var k = 3;
var phrase = "you know";
var sentence = prompt("Enter a sentence: ");
sentence = sentence.split(" ");
while (k <= sentence.length) {
sentence.splice(k, 0, phrase);
k += 4;
}
sentence = sentence.join(" ");
alert(sentence);
参见下面的for
循环,它从第三个单词开始,每次迭代增加三个单词(加上我们刚刚插入的短语),在句子末尾停止:
var phrase = "you know";
var sentence = "This is a sentence with a bunch of words in it."; // test data instead of prompt
var words = sentence.split(" ");
for (var i = 3; i <= words.length; i += 4) {
words.splice(i, 0, phrase);
}
console.log(words.join(" ")); // instead of alert
代码的问题是循环执行n
次,其中n
是句子中的单词数。当k
偏离句子末尾时,您可以通过break
ing来修复循环,但只构建一个更好的for
循环更简单。
开始
var sentence = prompt("Enter a sentence: ");
sentence = sentence.split(" ");
var newSentence = [];
for(var i = 0;i<sentence.length;i++){
if(i!=0 && i%3==0 && i<(sentence.length-1)){
newSentence.push("you know");
}
newSentence.push(sentence[i]);
}
sentence = newSentence.join(" ");