这是我在文本中查找单词的小脚本。当切片数组不起作用时,问题部分在for循环中。 array.slice想要取值(0,6)并且迭代数组的一些单词比这短,所以我想这可能是个问题。你能给我一个热点的建议来应对这种情况吗?
/*jshint multistr:true */
var text = "Etiam accumsan facilisis blandit. Praesent convallis sapien at sagittis ultrices. Proin adipiscing Michal, dolor at adipiscing volutpat, tellus neque adipiscing risus, at interdum magna ante quis risus. Quisque semper in mi imperdiet interdum. Fusce laoreet leo blandit, convallis tellus ut, posuere mauris michal. Quisque eu pulvinar felis. Maecenas ultricies a nulla et dignissim. Praesent egestas quam massa, eget dignissim nulla fringilla nec. Etiam non nulla imperdiet, tempus erat sit amet, luctus nibh. Aenean sit amet elementum nunc. Duis venenatis lacinia rutrum. Fusce vulputate michal lacinia odio, non laoreet metus placerat id. Nam ac risus et nisl pretium vulputate.";
var myName = "michal";
var hits = [];
var name = myName.toLowerCase();
var text2 = text.toLowerCase();
// changes string into array by space
var textWords = text2.split(" ");
// looks for each array value and compares it with the name
for (e = 0;e <= textWords.length; e++) {
console.log("______ new iteration -> another word to slice _______");
// each time 'e' changes, it turns array into another one, consisting of just a word (+ space or comma or dot)
var g = e+1;
var textWord = textWords.slice(e, g);
console.log(textWord);
// !! PROBLEM part, JS will not slice the former array so it is just name.length long !!
var potentialName = textWord.slice(0,name.length);
console.log(potentialName);
// pushes the result word into empty array 'hits'
if (potentialName === name) {
hits.push(potentialName);
// console.log(hits);
}
}
// takes the first value of the result array
var nameCopy = hits.slice(0,1);
// counts the number of result values
var count = hits.length;
// checks if ther is any matching value and how many of them there is
if ((nameCopy === name) && (count > 1)) {
console.log("I've found your name in the text! It's there " + count + " times.");
} else if (nameCopy === name) {
console.log("I've found your name in the text once.");
} else {
console.log("Your name is not in the text.");
}
答案 0 :(得分:1)
slice
返回一个数组,表示:
potentialName
是一个数组,而不是字符串,因此永远不会相等(===
)到name
。textWord
也是一个数组,由于g
总是e + 1
,我们可以进一步推断它总是一个包含单个元素的数组,即当前单词。我再说一遍:textWord
是一个包含单词的数组,而不是单词本身,正如您所期望的那样。让我们从循环的第一行开始,在第一次迭代中逐步运行程序:
e
为0。g
是e + 1
,0 + 1
是1。textWord
是textWords.slice(e, g)
,['etiam', 'accumsan', ...].slice(0, 1)
是['etiam']
(数组)。potentialName
为textWord.slice(0, name.length)
,['etiam'].slice(0, 6)
为['etiam']
。我猜第三步不是你想要的。我想你想得到第一个字。您需要做的不是slice
而是[]
,如下所示:textWords[e]
。使用此功能,在第一次迭代中,textWord
将为'etiam'
而不是['etiam']
。然后,您可以安全地将textWord
与name
进行比较,并使用===
查看它们是否相等。字符串不需要具有相同的长度。
我希望这会有所帮助。
当然,它们是一种简单的方法来计算文本中的单词,但我猜这是一个学习练习,所以它可以用于此目的。
答案 1 :(得分:0)
不要使用name.length,你必须适应每个单词的长度,并检查匹配所需的长度。您可以将每个单词分成单独的字母(“”)并检查长度。 name.length将始终为6。