如何检查对象/字典中是否存在属性?

时间:2014-01-31 18:44:35

标签: javascript node.js dictionary

我正在迭代一个单词数组并尝试将它们填充到对象文字中,这样我就可以为文字/字典中的每个单词分配这些单词出现次数的值。问题是我需要检查以确保该单词尚未添加到我的文字中。我尝试使用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中执行此操作?

3 个答案:

答案 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字典一样使用,但它们实际上并不是一回事。