Не удается получить доступ к свойству объекта, даже если оно отображается в журнале консоли

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