Не удается получить доступ к свойству объекта, даже если оно отображается в журнале консоли
Ниже вы можете увидеть результаты этих двух журналов. Первый четко показывает полный объект со свойством, к которому я пытаюсь получить доступ, но на следующей строке кода я не могу получить к нему доступ с помощью config.col_id_3
(см. "Undefined" на скриншоте?). Кто-нибудь может объяснить это? Я могу получить доступ ко всем другим свойствам, кроме field_id_4
.
console.log(config);
console.log(config.col_id_3);
Это то, что эти строки печатают в консоли
![Console output]()
Ответы
Ответ 1
Выход console.log(anObject)
вводит в заблуждение; состояние отображаемого объекта разрешается только при расширении >
в консоли. Это не состояние объекта, когда вы console.log
'd объект.
Вместо этого попробуйте console.log(Object.keys(config))
или даже console.log(JSON.stringify(config))
, и вы увидите ключи или состояние объекта во время вызова console.log
.
Вы будете (обычно) находить, что ключи добавляются после вашего вызова console.log
.
Ответ 2
У меня только что возникла проблема с документом, загруженным из MongoDB, используя Mongoose.
При запуске console.log()
для всего объекта будут отображаться все поля документа (хранятся в db). Однако некоторые индивидуальные аксессоры свойств возвращают undefined
, когда другие (включая _id
) работают нормально.
Оказалось, что аксессоры свойств работают только для тех полей, которые указаны в моем определении mongoose.Schema(...)
, тогда как console.log()
и JSON.stringify()
возвращают все поля, хранящиеся в db.
Решение (если вы используете Mongoose): убедитесь, что все ваши поля db определены в mongoose.Schema(...)
.
Ответ 3
Проверьте, есть ли внутри объекта массив объектов. У меня была аналогичная проблема с JSON:
"terms": {
"category": [
{
"ID": 4,
"name": "Cirugia",
"slug": "cirugia",
"description": "",
"taxonomy": "category",
"parent": null,
"count": 68,
"link": "http://distritocuatro.mx/enarm/category/cirugia/"
}
]
}
Я попытался получить доступ к ключу 'name' из категории, и я получил ошибку undefined, потому что я использовал:
var_name = obj_array.terms.category.name
Тогда я понял, что он имеет квадратные скобки, это означает, что он имеет массив объектов внутри ключа категории, потому что он может иметь более одного объекта категории. Итак, чтобы получить ключ "name", я использовал это:
var_name = obj_array.terms.category[0].name
И это делает трюк.
Может быть, слишком поздно для этого ответа, но я надеюсь, что кто-то с той же проблемой найдет это, как я сделал, прежде чем найти решение:)
Ответ 4
Свойство, к которому вы пытаетесь получить доступ, возможно, еще не существует. Console.log работает, потому что он выполняется после небольшой задержки, но это не относится к остальной части вашего кода. Попробуйте следующее:
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 100);
Ответ 5
У меня была такая же проблема. Решение для меня использовало строковый вывод в качестве входных данных для разбора JSON. это сработало для меня. надеюсь, что он вам полезен
var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
Ответ 6
Сегодня я боролся с этой проблемой и думал, что оставлю ответ с моим решением.
Я получал объект данных через ajax, что-то вроде этого:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Предположим, что этот объект находится в переменной, называемой данными. Всякий раз, когда я ссылался на data.i18n
, я получил undefined
.
-
console.log(data)
показал объект как ожидалось
-
console.log(Object.keys(data))
сказал ["constants","i18n"]
как ожидалось
- Переименование i18n на inter ничего не изменило
- Я даже попытался переключить данные, чтобы сделать "i18n" первым объектом
- Перемещенный код, чтобы убедиться, что объект был полностью установлен, и никаких проблем с обещанием ajax не было.
Ничего не помогло... Тогда на стороне сервера я написал данные в журнал php, и он показал это:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
"i" в ключе индекса был фактически u0456 (кириллица i). Это не было видно в моем редакторе php или в журнале консоли браузера. Только журнал php обнаружил это... Это было сложно...
Ответ 7
В моем случае я передавал объект обещанию, в рамках обещания я добавлял больше ключей/значений в объект, и когда это было сделано, обещание вернуло объект.
Однако, с небольшим взглядом с моей стороны, обещание возвращало объект, пока он не был полностью закончен... таким образом, остальная часть моего кода пыталась обработать обновленный объект, и данных еще не было. Но, как и выше, в консоли я видел, что объект полностью обновлен, но не смог получить доступ к ключам - они возвращались undefined. Пока я не увидел это:
console.log(obj) ;
console.log(obj.newKey1) ;
// returned in console
> Object { origKey1: "blah", origKey2: "blah blah"} [i]
origKey1: "blah"
origKey2: "blah blah"
newKey1: "this info"
newKey2: "that info"
newKey3: " more info"
> *undefined*
[i] - маленький значок, когда я навис над ним, он сказал Object value at left was snapshotted when logged, value below was evaluated just now
. То, когда мне пришло в голову, что мой объект оценивался до того, как обещание полностью обновило его.
Ответ 8
Мои данные были только строкой данных json. (Эта переменная хранилась как строка json в сеансе).
console.log(json_string_object)
- > возвращает только представление этой строки, и нет возможности различать, является ли строка или объект.
Итак, чтобы заставить его работать, мне просто нужно было преобразовать его в реальный объект:
object = JSON.parse(json_string_object);
Ответ 9
Я не пишу здесь много из-за раздражения из-за отсутствия достаточного количества постов, чтобы комментировать, но парень, который разместил это ниже, был прав. Вызов ajax не был завершен, когда вы попытались получить доступ к объекту. Я бы даже пошел дальше и использовал 500 вместо 100 для тайм-аута, просто чтобы быть уверенным.
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 500);
Ответ 10
Это может кому-то помочь, так как у меня была похожая проблема, в которой JSON.parse() возвращал объект, который я мог напечатать на console.log(), но я не мог получить доступ к определенным полям, и ни одно из вышеупомянутых решений не помогло мне. Как использование комбинации JSON.parse() с JSON.stringify().
var jsonObj = JSON.parse(JSON.stringify(responseText))
// where responseText is a JSON String returned by the server.
console.log(jsonObj) ///Was printing the object correctly
console.log(jsonObj.Body) /// Was printing Undefined
Я решил проблему с помощью другого парсера, предоставленного ExtJs Ext.decode();
var jsonObj = Ext.decode(responseText)
console.log(jsonObj.Body) //Worked...
Ответ 11
В 2018 году Mozilla предупреждает нас в Документах Mozilla здесь !
Я цитирую "Регистрация объектов":
Не используйте console.log(obj);
, используйте console.log(JSON.parse(JSON.stringify(obj)));
,
Таким образом, вы уверены, что видите значение obj в тот момент, когда вы его регистрируете.
Ответ 12
если вы используете TYPESCRIPT
и/или ANGULAR
, это может быть так!
.then((res: any) => res.json())
Установка типа ответа для любой исправленной этой проблемы для меня, я не мог получить доступ к свойствам ответа, пока я не установил res: any
посмотреть этот вопрос Свойство '_body' не существует по типу 'Response'
Ответ 13
В моем случае так получилось, что, хотя я получаю данные в формате модели, подобной myMethod(data:MyModelClass)
пока полученный объект не будет myMethod(data:MyModelClass)
тип string. Который у в console.log (данные) я получаю содержимое. Решение - просто проанализировать JSON (в моем случае)
const model:MyMOdelClass=JSON.parse(data);
Мысль может быть полезной.
Ответ 14
Я только что столкнулся с этой проблемой с объектами, сгенерированными csv-parser из файла CSV, сгенерированного MS Excel. Я был в состоянии получить доступ ко всем свойствам, кроме первого свойства - но это было бы хорошо, если бы я написал весь объект, используя console.log.
Оказалось, что формат CSV UTF-8 вставляет 3 байта (ef bb bf) в начале, соответствующие невидимому символу - которые были включены как часть первого заголовка свойства csv-parser. Решение состояло в том, чтобы заново сгенерировать CSV, используя опцию не-UTF, и это исключило невидимый символ.
Ответ 15
У меня была похожая проблема, надеюсь, следующее решение кому-нибудь поможет.
Вы можете использовать функцию setTimeout
как предлагают некоторые парни, но вы никогда не знаете, как долго ваш браузер должен определить ваш объект.
Из этого я бы предложил вместо этого использовать функцию setInterval
. Он будет ждать, пока ваш объект config.col_id_3
будет определен, а затем запустит вашу следующую часть кода, которая требует ваших конкретных свойств объекта.
window.addEventListener('load', function(){
var fileInterval = setInterval(function() {
if (typeof config.col_id_3 !== 'undefined') {
// do your stuff here
clearInterval(fileInterval); // clear interval
}
}, 100); // check every 100ms
});
Ответ 16
Попробуйте с настройкой [0] или config [0].col_id_3
У меня тоже была эта проблема, я смог увидеть объект, чтобы его регистрировать, но нет доступа к нему из кода. Я попытался добавить перед ним [0] и решить мою проблему. Затем я мог бы получить доступ ко всем свойствам.
Ответ 17
config = JSON.parse(config);
У меня было то же самое, данные были текстом, а не JSON, как я ожидал.
Ответ 18
У меня была одна и та же проблема, и никакое решение выше не работало для меня, и после этого было похоже, что угадайте работу. Однако обертка моего кода, который создает объект в функции setTimeout
, сделала трюк для меня.
setTimeout(function() {
var myObj = xyz; //some code for creation of complex object like above
console.log(myObj); // this works
console.log(myObj.propertyName); // this works too
});
Ответ 19
У меня была аналогичная проблема или, возможно, просто связанная.
В моем случае я обращался к свойствам объекта, но один из них был undefined. Я обнаружил, что проблема связана с белым пространством в коде на стороне сервера при создании ключа, val объекта.
Мой подход был следующим...
![создание моего объекта... обратите внимание на пробел в слове]()
![ответ, который я получаю от моего REST API]()
![код javascript для регистрации значений]()
![выводить результаты из консоли]()
После удаления пробела из кода на стороне сервера, создающего объект, я могу теперь получить доступ к свойству, как показано ниже...
![результат после удаления пробелов]()
Это может быть и не проблема с предметом вопроса, а для моего дела, и может быть так для кого-то другого. Надеюсь, что это поможет.
Ответ 20
У меня была такая же проблема с документом, загруженным из MongoDB с использованием Mongoose.
Оказалось, что я использую свойство find()
для возврата только одного объекта, поэтому я изменил find()
на findOne()
и все у меня сработало.
Решение (если вы используете Mongoose): убедитесь, что вы возвращаете только один объект, чтобы вы могли анализировать его object.id
иначе он будет обрабатываться как массив, поэтому вам нужно получить к нему доступ как к этому object[0].id
.
Ответ 21
Для меня это оказалось проблемой, связанной с мангустом.
Я перебирал объекты, полученные из запроса Монго. Я просто должен был удалить:
items = await Model.find()
И замените его на:
items = await Model.find().lean()
Ответ 22
У меня возникла такая проблема, и я нашел решение для Underscore.js. Мой начальный журнал не имел никакого смысла:
console.log(JSON.stringify(obj, null, 2));
> {
> "code": "foo"
> }
console.log(obj.code);
> undefined
Я нашел решение, также глядя на ключи объекта:
console.log(JSON.stringify(Object.keys(obj)));
> ["_wrapped","_chain"]
Это заставило меня понять, что obj
на самом деле является оберткой Underscore.js вокруг объекта, и первоначальная отладка лежала мне.
Ответ 23
У меня была аналогичная проблема (при разработке для SugarCRM), где я начинаю с:
var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});
// This should load object with attributes
leadBean.fetch();
// Here were my attributes filled in with proper values including name
console.log(leadBean);
// Printed "undefined"
console.log(leadBean.attributes.name);
Проблема была в fetch()
, ее асинхронном вызове, поэтому мне пришлось переписать мой код на:
var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});
// This should load object with attributes
leadBean.fetch({
success: function (lead) {
// Printed my value correctly
console.log(lead.attributes.name);
}
});
Ответ 24
Отличные предложения здесь. Я добавлю, так как кто-то может найти это полезным.
Будьте в курсе кэширования, в браузере или удаленно.
Я боролся с этим, когда я развиваюсь в Интернете, и реализовал простую стратегию.
- Я положил анти-кэширование на загрузку браузера моего js script.
quote: "добавить строку запроса"? v = 1 "ко всем файлам .css и .js, чтобы предотвратить кеширование."
- Я помещаю дополнительный консольный журнал, который я модифицирую перед тем, как попробовать новый запрос:
console.log( "");
Если я не вижу этот новый журнал в консоли, я знаю, что у меня есть проблема с кешем.
Как только я верну синтаксис, я удалил задержку, предложенную ранее, и все хорошо. Для меня мне пришлось использовать: "JSON.stringify("
Ответ 25
Отличные предложения. У меня была аналогичная проблема, так что мои два цента.
Одна вещь, которая фиксировала проблему, заключалась в добавлении "json: true" в мои параметры запроса. (это, конечно, зависит от используемой вами библиотеки, однако общая предпосылка одинаков - укажите формат содержимого, который вы ожидаете получить.)
Ответ 26
Сегодня я столкнулся с такой же проблемой. В моем случае ключи были вложены, то есть key1.key2.
Я разделил ключи с помощью split(), а затем использовал квадратную нотацию, которая работала для меня.
var data = {
key1: {
key2: "some value"
}
}
Я разделил клавиши и использовал их так: data [key1] [key2], который выполнил эту работу для меня.
Ответ 27
У меня была такая же проблема сегодня. Проблема была вызвана uglify-js. После того, как я выполнил тот же самый код без исправлений, проблема была решена. Удаление
--mangle-props
от uglify-js было достаточно иметь рабочий код uglified.
Возможно, лучше всего использовать какой-то префикс для свойств, которые должны быть искажены с помощью правила регулярных выражений для uglify-js.
Вот источник:
var data = JSON.parse( content);
...
this.pageIndex = parseInt(data.index);
this.pageTotal = parseInt(data.total);
this.pageLimit = parseInt(data.limit);
и вот как это было увеличено:
var n = JSON.parse( t);
...
this._ = parseInt(n.index), this.g = parseInt(n.total), this.D = parseInt(n.C)
Ответ 28
Доброе утро.
У меня похожая проблема. Кто-нибудь может мне помочь? Вот код:
function serialize(form) {
var data = new FormData(document.querySelector(form));
return data;
}
var MakeAjaxConn = function (url, data, action) {
// Ação para PHP ler
data.append('action', action);
// Variáveis auxiliares/acessórias
var request = new XMLHttpRequest(), result = "";
request.onreadystatechange = function () {
if (request.readyState == 4) {
if (request.status == 200) {
if (request.responseText.length > 0) {
result = request.responseText;
} else {
result = '<p>Nenhum valor retornado.</p>';
}
} else {
result += "<p>Atenção<p>";
result += "<p>Uma instabilidade provocou um erro. Tente novamente em 5min.</p>";
result += "<p>As informações abaixo são importantes, tire um print. Se o problema persistir, contate o administrador.</p>";
result += "<p>ReadyState = " + request.readyStat + "</p>";
result += "<p>Status = " + request.status + "</p>";
}
MakeAjaxConn.prototype.result = result;
}
};
request.open('POST', url, true);
request.send(data);
};
button.addEventListener('click', function () {
msg.innerHTML = '<div><img src="' + document.location.origin + '/public/g_imgs/load.svg"></div><div>Por favor, aguarde...</div>';
data = serialize('form#login');
var ajaxObj = new MakeAjaxConn('../app/controller/admin/ajax/login.php', data, 'login');
console.log(ajaxObj);
});
Ответ на заявку на консоли: введите описание изображения здесь
Я не могу получить доступ к "результату" значения внутри прото.
Ответ 29
Ни один из JSON stringify/parse не работал для меня.
formValues.myKey: undefined
formValues.myKey with timeout: content
Я хотел значение formValues.myKey
, и что было сделано, так это setTimeout 0, как в примере ниже. Надеюсь, это поможет.
console.log('formValues.myKey: ',formValues.myKey);
setTimeout( () => {
console.log('formValues.myKey with timeout: ', formValues.myKey);
}, 0 );
Ответ 30
У меня была такая же проблема при работе с функцией, которая делает аякс-вызов. В моем случае у меня возникли проблемы с получением правильного кода ошибки с сервера.
Это функция:
function getListItem(listItemUri){
return jQuery.ajax({
url: listItemUri,
type: "Get",
headers: { "accept": "application/json;odata=verbose" }
});
}
Код ниже был неправильным и отображал объект в консоли, но был бы undefined при попытке получить к нему доступ.
var list = getListItem(uri);
var failed = list.fail(onerror);
console.log(failed); //displays object which included a status
console.log(obj.status); //but when trying to retrieve the status message it was undefined
Следующий код позволил мне получить доступ к значениям в объекте. Ключ заключался в использовании list.fail как функции вместо назначения переменной.
var list = getListItem(uri);
list.fail(function(obj){
console.log(obj); //displays object
console.log(obj.status); //the object is now defined and I am able to see the error code returned by the server
});