2017-02-14 11 views
-2

Я наткнулся на эту загадочную ошибку при переходе по объектам JavaScript с использованием конструкции for..in. У меня есть набор фиктивных данных похожи на это:Переменная неопределенная внутри JavaScript For-In loop

{ 
    "12345678" : { 
    ... 
    }, 
    "12345679" : { 
    ... 
    }, 
    "12345680" : { 
    ... 
    } 
} 

Может быть, это имеет значение, этот объект извлекается из базы данных, используя Firebase ответ встроенного .val() метода. Это обычный объект js.

Однако при обходе объекта переменная, объявленная внутри, цикл for..in как-то не определен. Я удалил весь окружающий код, кроме цикла, и ошибка все еще возникает:

for (key in data) { 
console.log(data[key]); 
} 
// Throws ReferenceError: key is not defined 

Я действительно сбит с толку. Как это возможно? Я думал, что переменная, прошедшая до for..in, всегда была доступна (или хотя бы определена) внутри цикла.

+1

Вы когда-нибудь определяли «ключ»? Как 'for (var key in data)'? Кроме того, попробовали ли вы распечатать 'data' с чем-то вроде' JSON.stringify (data, null, 4) '? – mc10

+0

Да, это было глупо. Не объявлял как «var» нигде. Я общался с этим уже полчаса. Думаю, пришло время спать. – ppajer

ответ

1

Как уже упоминалось в моем комментарии, вам, вероятно, нужно определить key; в противном случае вы (вероятно) определите глобальную переменную, которая может работать или не работать корректно. Кроме того, чтобы избежать несвязанных свойств появляться в цикле, используйте hasOwnProperty:

for (var key in data) { 
    if (!data.hasOwnProperty(key)) { 
     continue; 
    } 

    console.log(data[key]); 
} 

См How do I loop through or enumerate a JavaScript object? для получения дополнительной информации.

+0

Спасибо за отзыв на 'hasOwnProperty'. Первоначальная ошибка была надзором, но это то, что я должен начать использовать. – ppajer

0

вы просто не используете правильный синтаксис для инструкции for..in. Вам нужно определить key переменную с var (или let, если вы используете ES6): для того, чтобы использовать его в заявлении:

for(var key in data){ 
    console.log(data[key]) 
} 
+0

Так оно и было, спасибо! Я думаю, что пришло время спать, когда вы начинаете игнорировать такие вещи. :) – ppajer

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

  • Нет связанных вопросов^_^