我已经编写了一个基本功能来计算字符串中的字频率。首先,我将字符串拆分为一个数组,然后通过for循环迭代单词数组。也就是说,如果初始字符串为空(""),我的函数将会考虑""作为一个单词,因此结果是{"":1}而不是一个空对象。我最初认为由于for循环,空字符串根本不会注册。
我已经通过函数开头的if条件修复了这个问题,但我想知道是否有更好的方法来解决它。
function countWords(str) {
if (str === "") {
return {};
}
var counts = {};
var wordArray = str.split(" ");
for (i=0;i < wordArray.length; i++) {
word = wordArray[i];
if (!counts[word]) {
counts[word] = 1;
} else {
counts[word] += 1;
}
}
return counts;
}
我的Ruby代码等效并不需要任何东西来取出空字符串作为一个可行的单词目标,所以这让我感到困扰。
编辑:感谢所有回复。我感谢所有的帮助。
答案 0 :(得分:0)
取决于具体情况,但如果在您的情况下只将字符串作为参数传递,那么检查就足够了。
如果有undefined
,null
或其他falsy value作为参数传递的可能性,您可以执行此检查:
if (!str) {
return {};
}
如果您想要更严格的检查,您可以这样做:
if (!str || typeof str !== 'string') {
return {};
}
在这种情况下,您正在检查假值(正如我们在上面看到的空字符串是一个假值),并确保您将参数作为字符串。
答案 1 :(得分:0)
这是预期的行为。 .split()
不保证结果中的非空字符串。除非您明确过滤掉空字符串,否则.split()
返回的所有空字符串都将被计算在内。
由于.split
不会合并顺序拆分字符串,因此拆分后可能会有很多空字符串:try "a b c".split(" ")
。