如何正确地提醒数组/for循环中的项目



我正在做一个项目,将一个简单的句子转换为"青少年"会说的语句。我想在用户输入的句子中的每三个单词后面添加短语"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偏离句子末尾时,您可以通过breaking来修复循环,但只构建一个更好的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(" ");

最新更新