Ниже вы можете увидеть результаты этих двух журналов. Первый четко показывает полный объект со свойством, к которому я пытаюсь получить доступ, но в следующей строке кода я не могу получить к нему доступ config.col_id_3
(см. «Undefined» на скриншоте?). Кто-нибудь может объяснить это? Я могу получить доступ к любой другой собственности, кроме field_id_4
как также.
console.log(config);
console.log(config.col_id_3);
Это то, что эти строки печатают в консоли
javascript
console.log
Брайан Литцингер
источник
источник
console.log(JSON.stringify(config));
и поделиться O / PJSON.parse(obj)
Ответы:
Вывод
console.log(anObject)
вводит в заблуждение; состояние отображаемого объекта разрешается только при расширении>
в консоли. Это не состояние объекта, когда выconsole.log
были объектом.Вместо этого попробуйте
console.log(Object.keys(config))
или даже,console.log(JSON.stringify(config))
и вы увидите ключи или состояние объекта во время вызоваconsole.log
.Вы (обычно) обнаружите, что ключи добавляются после вашего
console.log
звонка.источник
>
кнопки в зависимости от того, расширяется ли массив или объект?У меня только что была эта проблема с документом, загруженным из MongoDB с использованием Mongoose .
При запуске
console.log()
всего объекта все поля документа (как хранятся в БД) будут отображаться. Тем не менее, некоторые отдельные свойства собственности вернутсяundefined
, когда другие (в том числе_id
) будут работать нормально.Оказалось, что методы доступа к свойствам работают только для тех полей, которые указаны в моем
mongoose.Schema(...)
определении, тогда какconsole.log()
иJSON.stringify()
возвращает все поля, хранящиеся в БД.Решение (если вы используете Mongoose) : убедитесь, что все ваши поля БД определены в
mongoose.Schema(...)
.источник
JSON.stringify()
(и Node'sconsole.log()
) меняют свое поведение, если данный объект имеет.toJSON()
функцию. Вывод, который вы видите, - это то.toJSON()
, что возвращает, а не исходный объект. Mongoose дает вам модельные объекты с тем,.toJSON()
который дает базовый объект БД. Объект модели имеет средства доступа только к полям, которые вы определяете в схеме, но тогда все поля db появляются, когда вы регистрируете его, потому что вы на самом деле видите базовый объект, возвращаемый.toJSON()
.Проверьте, есть ли внутри объекта массив объектов. У меня была похожая проблема с JSON:
Я попытался получить доступ к ключу «name» из «category» и получил неопределенную ошибку, потому что я использовал:
Затем я понял, что у него квадратные скобки, это означает, что у него есть массив объектов внутри ключа категории, потому что он может иметь более одного объекта категории. Итак, чтобы получить ключ 'name', я использовал это:
И это делает трюк.
Возможно, уже слишком поздно для этого ответа, но я надеюсь, что кто-то с той же проблемой найдет это, как я, прежде чем найти решение :)
источник
Я была такая же проблема. Решением для меня было использование строкового вывода в качестве входных данных для анализа JSON. это сработало для меня. надеюсь, что это полезно для вас
источник
Свойство, к которому вы пытаетесь получить доступ, может еще не существовать. Console.log работает, потому что он выполняется после небольшой задержки, но это не относится к остальной части вашего кода. Попробуй это:
источник
В моем случае я передавал объект обещанию, в рамках обещания я добавлял дополнительные ключи / значения к объекту, и когда это было сделано, обещание возвращало объект.
Тем не менее, с моей стороны был небольшой надзор, обещание возвращало объект до того, как он был полностью завершен ... таким образом, остальная часть моего кода пыталась обработать обновленный объект, а данные еще не были там. Но, как и выше, в консоли я увидел, что объект полностью обновлен, но не смог получить доступ к ключам - они возвращались неопределенными. Пока я не увидел это:
[Я] - маленькая иконка, когда я завис над ней, она сказала
Object value at left was snapshotted when logged, value below was evaluated just now
. Вот когда мне пришло в голову, что мой объект оценивается до того, как обещание полностью обновило его.источник
Я боролся с этой проблемой сегодня, и думал, что оставлю ответ со своим решением.
Я выбирал объект данных через ajax, что-то вроде этого:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Допустим, этот объект находится в переменной с именем data. Всякий раз, когда я ссылался,
data.i18n
я получилundefined
.console.log(data)
показал объект, как и ожидалосьconsole.log(Object.keys(data))
сказал,["constants","i18n"]
как и ожидалосьНичего не помогло ... Затем на стороне сервера я записал данные в журнал php, и он показал это:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
«I» в ключе индекса было на самом деле u0456 (кириллица i). Это не было видно в моем редакторе php или журнале консоли браузера. Только журнал php показал это ... Это было сложно ...
источник
Мои данные были просто строкой данных JSON. (Эта переменная была сохранена как строка json в сеансе).
-> возвращает только представление этой строки, и нет никакого способа сделать различие, является ли строка или объект.
Итак, чтобы заставить его работать, мне просто нужно было преобразовать его обратно в реальный объект:
источник
В 2018 году Mozilla предупреждает нас в Документах Mozilla здесь !
Я цитирую "Регистрация объектов" :
источник
Это может кому-то помочь, так как у меня была похожая проблема, в которой JSON.parse () возвращал объект, который я мог напечатать на console.log (), но я не мог получить доступ к определенным полям, и ни одно из вышеупомянутых решений не работало для меня. Как использование комбинации JSON.parse () с JSON.stringify ().
Я решил проблему с помощью другого парсера, предоставленного ExtJs Ext.decode ();
источник
В моем случае, так получилось, что, хотя я получаю данные в формате объекта модели,
myMethod(data:MyModelClass)
пока полученный объект не будет иметь тип string. Который у в console.log (данные) я получаю содержимое. Решение - просто проанализировать JSON (в моем случае)Мысль может быть полезной.
источник
Я только что столкнулся с этой проблемой с объектами, сгенерированными csv-parser из файла CSV, сгенерированного MS Excel. Я был в состоянии получить доступ ко всем свойствам, кроме первого свойства - но это было бы хорошо, если бы я написал весь объект, используя console.log.
Оказалось, что формат CSV UTF-8 вставляет 3 байта (ef bb bf) в начале, соответствующие невидимому символу - которые были включены как часть первого заголовка свойства csv-parser. Решение состояло в том, чтобы заново сгенерировать CSV, используя опцию не-UTF, и это исключило невидимый символ.
источник
У меня была похожая проблема, надеюсь, следующее решение кому-нибудь поможет.
Ты можешь использовать
setTimeout
функцию, как предлагают некоторые парни, но вы никогда не знаете, сколько именно времени требуется вашему браузеру для определения вашего объекта.Из этого я бы предложил
setInterval
вместо этого использовать функцию. Он будет ждать, пока ваш объект неconfig.col_id_3
будет определен, а затем запустит вашу следующую часть кода, которая требует ваших конкретных свойств объекта.источник
если вы используете
TYPESCRIPT
и / илиANGULAR
, это может быть так!.then((res: any) => res.json())
установив тип ответа на любой исправил эту проблему для меня, я не мог получить доступ к свойствам ответа, пока я не установил res: any
см. этот вопрос Свойство '_body' не существует для типа 'Ответ'
источник
У меня была та же проблема, и ни одно из вышеперечисленных решений не сработало для меня, и после этого мне показалось, что это похоже на догадки. Однако завершение моего кода, который создает объект в
setTimeout
функции, помогло мне.источник
У меня была похожая проблема или, возможно, только что связанная.
В моем случае я обращался к свойствам объекта, но один не был определен. Я обнаружил, что проблема была в пробелах в коде на стороне сервера при создании ключа val объекта.
Мой подход был следующим ...
После удаления пробела из серверного кода, создающего объект, я теперь могу получить доступ к свойству, как показано ниже ...
Это может не быть проблемой в случае предметного вопроса, но было для моего случая и может быть таковым для кого-то еще. Надеюсь, поможет.
источник
У меня была такая же проблема с документом, загруженным из MongoDB с использованием Mongoose.
Оказалось, что я использую свойство,
find()
чтобы вернуть только один объект, поэтому я перешелfind()
наfindOne()
и все работало для меня.Решение (если вы используете Mongoose): убедитесь, что вы возвращаете только один объект, чтобы вы могли разобрать его,
object.id
или он будет обрабатываться как массив, поэтому вам нужно получить к нему доступ таким образомobject[0].id
.источник
Для меня это оказалось проблемой Мангуста.
Я перебирал объекты, полученные из запроса Монго. Я просто должен был удалить:
И заменить его на:
источник
У меня была такая проблема, и я нашел, что решение было связано с Underscore.js. Моя первоначальная регистрация не имела смысла:
Я нашел решение, также посмотрев на ключи объекта:
Это привело меня к пониманию того, что
obj
самом деле это был обертка Underscore.js вокруг объекта, и первоначальная отладка была для меня ложью.источник
У меня была похожая проблема (при разработке для SugarCRM), где я начинаю с:
Проблема была в
fetch()
, его асинхронный вызов, поэтому мне пришлось переписать мой код в:источник
На всякий случай, если это кому-то полезно, у меня была похожая проблема, потому что кто-то создал переопределение для .toJSON в объекте, с которым я работал. Таким образом, объект был что-то вроде:
Но .toJSON () было:
Поэтому, когда я вызвал JSON.stringify (myObject), он вернул "{" bar ":" Hello "," baz ":" World "}". Однако Object.keys (myObject) обнаружил «foo».
источник
toJson()
это точка, которую никто здесь не упомянул. Я не знаю, почему этот ответ был отвергнут, поскольку это способ создать объект, значение которого отличается от его представления в json или в консоли. Я не знал, что он существует, пока не раскрыл его в другом ответе, и я думаю, что за этот ответ следует проголосовать, так как это вопрос, который следует учитывать при рассмотрении подобных вопросов.Я столкнулся с той же проблемой сегодня. В моем случае ключи были вложенными, т.е. key1.key2. Я разделил ключи, используя split (), а затем использовал обозначение в квадратных скобках, которое мне помогло.
Я разделил ключи и использовал их следующим образом: data [key1] [key2], которые сделали эту работу за меня.
источник
У меня была такая же проблема сегодня. Проблема была вызвана uglify-js. После того, как я выполнил тот же самый код без исправлений, проблема была решена. Удаление из
от uglify-js было достаточно иметь рабочий код uglified.
Возможно, лучше всего использовать какой-то префикс для свойств, которые должны быть искажены с помощью правила регулярных выражений для uglify-js.
Вот источник:
и вот как это было увеличено:
источник
Ни один из JSON stringify / parse не работал для меня.
Я хотел значение
formValues.myKey
и что трюк был setTimeout 0, как в примере ниже. Надеюсь, поможет.источник
Я только что столкнулся с этой проблемой, и короче говоря, мой API возвращал строковый тип, а не JSON. Так что это выглядело точно так же, когда вы печатали его в журнале, однако всякий раз, когда я пытался получить доступ к свойствам, я получал неопределенную ошибку.
Код API:
ранее я только возвращался:
источник
У меня была похожая проблема сегодня в React. В конце концов понял, что проблема была вызвана состоянием еще не устанавливается. Я звонил,
user.user.name
и хотя он отображался в консоли, я не мог получить к нему доступ в своем компоненте, пока не включил проверку, чтобы проверить,user.user
был ли установлен, а затем позвонилuser.user.name
.источник