2016-12-24 22 views
0

我已经写了一个基本函数来计算字符串中的词频。首先,我将字符串分成一个数组,然后通过循环遍历单词数组。也就是说,如果初始字符串为空(“”),我的函数将把“”作为一个单词,因此结果是{“”:1},而不是空对象。由于for循环,我最初认为空字符串根本不会注册。字数功能正在拾取“”作为可行单词吗?

我已经解决了这个问题,如果有条件的函数开始,但我想知道是否有更好的方法去解决它。

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

我在这里没有看到问题。 – hobbs

回答

0

取决于情况,但如果在你的情况下只有字符串作为参数传递,检查是足够好的。如果你想检查更加严格,你可以做

if (!str) { 
    return {}; 
} 

如果有的undefinednull或其他falsy value作为参数传递以及可能性,你可以这样做检查,而不是

if (!str || typeof str !== 'string') { 
    return {}; 
} 

在这种情况下,您正在检查falsy值(正如我们上面看到的空字符串是一个falsy值),并确保您获取参数字符串。

+0

我并没有在原来的提示中问这个问题,但我也想知道为什么我甚至需要首先检查。我的意思是,单独看for for循环,我不认为它会运行,因为我= 0和array.length = 0. – Tony

+0

哦。我现在明白了。因为我在阵列中注册它。 – Tony

+0

如果你试图对不是字符串的东西进行“拆分”,它会失败,所以根据情况进行检查可能会很好。 –

0

这是预期的行为。 .split()不保证结果中的非空字符串。除非明确地过滤掉空字符串,否则所有空字符串将被计数。

由于.split不合并顺序分割字符串,你可以拆分后有空字符串的很多:尽量"a b c".split(" ")

+0

我在玩了一下代码后自己得出了这个结论。不要少,谢谢你的意见。我需要更勤勉地对待自己的工作。与Ruby总体相比,刚发现Javascript稍微不像新手那么友好。 – Tony

+0

没问题。此外,它通常可以帮助(我)在节点repl /浏览器控制台/ jsfiddle中使用小段代码来查看它们如何与不同的入口一起工作。 – 9000

相关问题