我正在迭代一个单词数组并尝试将它们填充到对象文字中,这样我就可以为文字/字典中的每个单词分配这些单词出现次数的值。问题是我需要检查以确保该单词尚未添加到我的文字中。我尝试使用in
检查文字中是否存在属性,但是它会引发错误:
Cannot use 'in' operator to search for 'We' in undefined
这是一个有问题的功能:
我评论了导致问题的那一行
function wordCountDict(filename) {
wordCount = {};
inputFile = fs.readFile( root + filename, 'utf8', function( error, data ) {
if(error) {
console.log('error: ', error)
return false;
}
var words = data.split(" ");
for (i in words) {
if(words[i] in wordCount) { // This is where the problem occurs
wordCount[words[i]]++;
} else {
wordCount[words[i]] = 1;
}
console.log(words[i]);
}
});
}
我来自python,这一直是实现这一目标的最好/最简单的方法,但javascript似乎并不同意。
我将如何在JavaScript中执行此操作?
答案 0 :(得分:5)
将wordCount
声明为该函数的局部变量。它可能会在其他地方被覆盖:
function wordCountDict(filename) {
var wordCount = {};
...
}
答案 1 :(得分:-2)
这是一个坏主意
for (i in words) {
不要使用for循环遍历数组!如果将某些内容添加到数组原型中,则会进行检查。
var words = data.split(" ");
for (var i=0; i<words.length; i++) {
if(words[i] in wordCount) {
接下来,readFile是异步的。如果它的代码outide将wordCount重置为未定义的值,则可能会出现此错误。在循环完成时,最好使用局部变量并设置全局值。此外,return false
在readFile中没有任何内容。
function wordCountDict(filename) {
var tempWordCount = {};
var inputFile = fs.readFile( root + filename, 'utf8', function( error, data ) {
if(error) {
console.log('error: ', error)
return false;
}
var words = data.split(" ");
for (var i = 0; i<words.length; i++) {
if(words[i] in wordCount) { // This is where the problem occurs
wordCount[words[i]]++;
} else {
wordCount[words[i]] = 1;
}
console.log(words[i]);
}
wordCount = tempWordCount; //set the global variable equal to the local value
});
}
答案 2 :(得分:-2)
如果你想做的只是检查物体是否存在,你可以使用:
if(typeof wordCount[words[i]] === 'undefined'){
...
}
我不建议只使用if(wordCount[words[i]])
,因为从技术上讲,对象的属性可能存在,但计算结果为false。
请注意,在Javascript中执行类似myObject.something的操作等同于对象上的myObject ['something'],并且当您使用myObject ['somethingElse']时,您基本上只是动态地向对象添加成员。在Javascript中,对象可以像Python字典一样使用,但它们实际上并不是一回事。