2014-01-31 6 views
0

Я повторяю массив слов и пытаюсь записать их в литерал объекта, поэтому я могу назначить значение того, сколько раз эти слова происходят с каждым словом в литеральном/словаре. Проблема в том, что мне нужно проверить, чтобы слово не было добавлено в мой литерал. Я попытался с помощью 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?

+2

Я не могу видеть, как вы получите сообщение об ошибке, если вы не разрушив объект 'wordCount' перед асинхронным' readFile' обратного вызова запуска. –

+2

Действительно ли 'if (wordCount [слова [i]]) дает такую ​​же ошибку? – epascarello

+1

Очевидно, что существует объект, и использование 'in' для проверки ключей в объекте не должно прерываться, и когда он говорит, что объект не определен, здесь происходит что-то еще, что мы не видим. – adeneo

ответ

5

Объявление wordCount в качестве локальной переменной для этой функции. Это, вероятно, перезаписывается в другом месте:

function wordCountDict(filename) { 
    var wordCount = {}; 
    ... 
} 
+0

Умный человек. Python заставил меня опустить вары, а не хорошо. – Scott

+0

Да, следите за этими глобальными переменными. Легко случайно создать их в javascript (особенно, если вы привыкли к python) – forgivenson

+0

@Scotty: Подумайте о том, как запустить свой код в строгом режиме. Это ловит некоторые распространенные ошибки. Если ваш код находится в узловом модуле, поставьте '' use strict '; 'в верхней части модуля. Есть некоторые незначительные различия в поведении, которые будут иметь строгий режим, но я думаю, что они к лучшему. –

-2

Это плохая идея

for (i in words) { 

не использовать цикл для перебора массива! Если что-то добавлено в прототип массива, он будет проверен.

var words = data.split(" "); 
    for (var i=0; i<words.length; i++) { 

    if(words[i] in wordCount) { 

Следующее, прочитанноеFile является асинхронным. Если код вне его сбрасывает 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 

    }); 
} 
+0

Да, это плохая форма, но это не ответ на вопрос. – jfriend00

+0

@ jfriend00: На самом деле это, вероятно, ответ. Я думаю, что OP отметил неправильное использование 'in' в вопросе. –

+0

for-in петли должны работать на массивах, даже если это вообще не очень хорошая идея. – adeneo

-2

Если все, что вы хотели бы сделать, это проверка существования в объекте, вы можете использовать это:

if(typeof wordCount[words[i]] === 'undefined'){ 
    ... 
} 

Я не рекомендовал бы просто использовать if(wordCount[words[i]]) потому что технически не может быть собственностью объект, который существует, но оценивает значение false.

Обратите внимание, что в Javascript что-то вроде myObject.something эквивалентно myObject ['something'] на объекте, и что при использовании myObject ['somethingElse'] вы в основном просто динамически добавляете элементы в объект. В Javascript объекты могут использоваться как словари Python, но на самом деле это не одно и то же.

+0

Как и большинство других ответов, это тоже неправильно, или в лучшем случае от темы. Проблема заключалась в том, что 'wordCount' был' undefined'. У вас будет сбой * TypeError *. –

Смежные вопросы