Неможливо отримати доступ до властивості об'єкта, навіть якщо він відображається в консольному журналі


329

Нижче ви бачите вихід із цих двох журналів. Перший чітко показує повний об'єкт із властивістю, до якої я намагаюся отримати доступ, але в наступному рядку коду я не можу отримати доступ до нього config.col_id_3(див. "Не визначений" на скріншоті?). Хтось може це пояснити? Я можу отримати доступ до будь-якої іншої власності, крім неї field_id_4.

console.log(config);
console.log(config.col_id_3);

Це те, що ці рядки друкуються в консолі

Вихід консолі


6
ви можете спробувати console.log(JSON.stringify(config));ans поділитися o / p
Arun P Johny

2
також спробуйте це, якщо це працює console.log (config ['col_id_3']);
zzlalani

5
це працювало для мене. використання раціоналізованого виводу як нового вводу для робочого об'єкта: JSON.parse (JSON.stringify (obj))
Tope

2
Посилення та згодом розбір не вирішили питання для мене чомусь. Однак розбір прямо зробив. JSON.parse(obj)
Якоб Парізо

3
Чомусь усі відповіді пояснюють, як записати об’єкт без ключа, а не як отримати доступ до ключа
remidej

Відповіді:


296

Вихід console.log(anObject)оманливий; стан відображуваного об'єкта вирішується лише при розгортанні >консолі. Це не той стан об'єкта, коли ви будете console.logоб'єктом.

Натомість спробуйте console.log(Object.keys(config)), або навіть, console.log(JSON.stringify(config))і ви побачите клавіші, або стан об'єкта в той момент, коли ви дзвонили console.log.

Ви (зазвичай) знайдете, що ключі додаються після вашого console.logдзвінка.


11
Це поведінка помилка чи особливість? Якщо це особливість, які міркування за нею?
ESR

2
Як тоді можна обійти це? Встановлення тайм-ауту НЕ здається хорошим рішенням.
Саханд

9
Тоді як ми можемо отримати доступ до цієї властивості, від об’єкта?
Рохіт Шарма

Для уточнення, чи відрізняється поведінка >кнопки залежно від того, розширюється масив чи об'єкт?
Flimm

Зробивши тестування, схоже, що ви зіткнулися з цим питанням навіть із масивом, тому я рекомендую замість цього зробити JSON.stringify.
Flimm

62

Щойно у мене виникла ця проблема з документом, завантаженим з MongoDB за допомогою Mongoose .

При запуску console.log()на весь об'єкт відображатимуться всі поля документа (як збережені в db). Однак деякі індивідуальні майнові майнові повернуться undefined, коли інші (в тому числі _id) працювали нормально.

Виявилося, що доступність властивостей працює лише для тих полів, які вказані в моєму mongoose.Schema(...)визначенні, тоді як console.log()і JSON.stringify()повертає всі поля, що зберігаються в db.

Рішення (якщо ви використовуєте Mongoose) : переконайтеся, що всі ваші поля DB визначені в mongoose.Schema(...).


Відмінно пояснюючи цю проблему, я вважав, що Mongoose дозволить мені запитувати json без схеми (у зовнішньому сценарії), але заважатиме писати. Здається, він працює тому, що _id присутній, а console.log каже, що все інше повинно бути доступним, але це не так. Химерність.
bstar

7
Виявляється, я бачив це тому, що JSON.stringify()(і Вузол console.log()) змінюють свою поведінку, якщо даний об'єкт має .toJSON()функцію. Вихід, який ви бачите, - це те, що .toJSON()повертає, а не оригінальний об'єкт. Мангуст дає вам модельні об'єкти з a, .toJSON()що дає базовий db-об’єкт. Об'єкт моделі має лише аксесуари для полів, визначених вами у схемі, але потім усі поля db з'являються під час реєстрації, тому що ви дійсно бачите, як повертається базовий об'єкт .toJSON().
ramin

Чому мангуст не дозволяє читати інші властивості?
Каннан Т

Це було корисно для мене під час завантаження CSV у mongodb та отримання ресурсу. Переконайтеся, що ваші імена відповідають. Чудова відповідь дякую.
9BallOnTheSnap

1
Дякую за це. Я збожеволів, побачивши це в консолі і не маючи доступу до нього. Додав значення моїй схемі, і мені добре йти. Знову дякую!
alittletf

27

Перевірте, чи всередині об’єкта є масив об’єктів. У мене була схожа проблема із JSON:

    "terms": {
        "category": [
            {
                "ID": 4,
                "name": "Cirugia",
                "slug": "cirugia",
                "description": "",
                "taxonomy": "category",
                "parent": null,
                "count": 68,
                "link": "http://distritocuatro.mx/enarm/category/cirugia/"
            }
        ]
    }

Я спробував отримати доступ до ключа 'name' з 'category', і я отримав невизначену помилку, оскільки використовував:

var_name = obj_array.terms.category.name

Тоді я зрозумів, що він має квадратні дужки, це означає, що він має масив об'єктів всередині ключа категорії, оскільки він може мати більше одного об'єкта категорії. Отже, для отримання ключа "ім'я" я використав це:

var_name = obj_array.terms.category[0].name

І це робить трюк.

Можливо, для цієї відповіді пізно, але я сподіваюся, що хтось із тією ж проблемою знайде це, як і я, перш ніж знайти рішення :)


23

У мене було те саме питання. Для мене вирішенням було використання раціоналізованого виводу як вхідного сигналу для розбору JSON. це працювало для мене. сподіваємось, що вона вам корисна

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);

2
Так, це спрацювало, але чому це потрібно? У мене вже є JSON, навіщо мені це робити?
травень

@dilpeshjain Я не зовсім впевнений, але я б ризикнув, що у нас насправді вже немає JSON (можливо, зараз існує лінивий сценарій типу завантаження, я зараз недостатньо обізнаний про це), але передаю все, що ми маємо в JSON.stringify вимагає повернути рядок (як, наприклад, потрібний виклик console.log для друку). Оскільки я знаю, що я можу принаймні отримати рядок, то я можу використовувати цю рядок для створення об'єкта JSON відразу ж точно.
Tope

4
@jain вам це потрібно, тому що javascript - жахлива мова

22

Власність, до якої ви намагаєтеся отримати доступ, ще не існує. Console.log працює, тому що він виконується після невеликої затримки, але це не так для решти вашого коду. Спробуйте це:

var a = config.col_id_3;    //undefined

setTimeout(function()
{
    var a = config.col_id_3;    //voila!

}, 100);

1
Я використовував метод завантаження, щоб отримати свої об'єктні значення. Але все одно вперше дає мені визначитись. Ця мова робить мене мертвим день у день
Teoman Tıngır

простим рішенням було б реалізувати обіцянку спостерігача, яка перевіряє, чи визначено потрібне властивість за допомогою setTimeout, і вирішує + знімає час очікування, коли властивість стане доступною.
Lai Xue

Ого. За свої 15 років веб-програмування я ніколи не стикався з цим і ніколи не замислювався над тим, як працює журнал консолі. Ваша відповідь допомогла прояснити щось із цього.
Кай Цін

12

У моєму випадку я передавав об’єкт обіцянці, в межах обіцянки я додавав об'єкту більше ключа / значення, і коли це було зроблено, обіцянка повернула об'єкт.

Однак, трохи поглянувши з мого боку, обіцянка повертала об’єкт ще до того, як він був повністю закінчений ... таким чином, решта мого коду намагалася обробити оновлений об’єкт, і даних ще не було. Але, як вище, в консолі я побачив об’єкт повністю оновленим, але не мав доступу до клавіш - вони поверталися не визначеними. Поки я не бачив цього:

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. Тоді, коли мені прийшло в голову, що мій предмет оцінюють до того, як обіцянка повністю оновила його.


10

Я сьогодні боровся з цим питанням і думав, що залишу відповідь зі своїм рішенням.

Я добирав об’єкт даних через ajax, приблизно так: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

Скажімо, цей об’єкт знаходиться у змінній, що називається даними. Щоразу, коли я посилався, data.i18nя отримував undefined.

  1. console.log(data) показав об’єкт як очікувалося
  2. console.log(Object.keys(data)) сказав ["constants","i18n"] як очікувалося
  3. Перейменування i18n до інтер нічого не змінило
  4. Я навіть намагався переключити дані, щоб зробити "i18n" першим об'єктом
  5. Перенесли код навколо, щоб переконатися, що об’єкт повністю встановлений, і не було проблем з обіцянкою ajax.

Нічого не допомогло ... Тоді на стороні сервера я записав дані в журнал php, і він виявив це:

{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}

"Я" в індексному ключі насправді був u0456 (кирилиця i). Це не було видно в моєму редакторі php чи в журналі консолі браузера. Лише журнал php виявив це ... Це було хитро ...


1
Це також було моїм питанням; замість цього в деяких випадках екземпляри мали кириличний символ "с". Я знайшов це, шукаючи у моєму файлі потрібний рядок; підозрілий не був обраний, так що мені сказали, що неправильний персонаж був невидимий для очей.
лицар

Ця відповідь фактично допомогла мені знайти своє рішення. Моя проблема в тому, що я неправильно написав своє ім’я змінної. Я зробив "udpate" замість "update" lol
Савлон

8

Мої дані були просто рядком даних json. (Ця змінна була збережена як json рядок у сеансі).

console.log(json_string_object)

-> повертає просто представлення цієї рядки, і немає ніякого способу змінити, чи є рядок чи об'єкт.

Отже, щоб він працював, мені просто потрібно було перетворити його на реальний об'єкт:

object = JSON.parse(json_string_object);

Це була єдина відповідь, яка працювала на мене і також згадується в коментарях до оригінального питання, це повинно бути вище.
abagh0703

5

У 2018 році Mozilla попереджає нас у Mozilla Docs тут !

Я цитую "Об'єкти журналу" :

Не використовуйте console.log(obj);, не використовуйте console.log(JSON.parse(JSON.stringify(obj)));.

Таким чином ви впевнені, що бачите значення obj в момент реєстрації.


4

Це може допомогти комусь, оскільки у мене була схожа проблема, коли 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...

2

У моєму випадку це просто трапляється так, що навіть якщо я отримую дані у форматі такої моделі, як myMethod(data:MyModelClass) об'єкт, поки отриманий об'єкт не був тип рядка. Який y у console.log (дані) я отримую вміст. Рішення - просто розібрати JSON (у моєму випадку)

const model:MyMOdelClass=JSON.parse(data);

Думка може бути корисною.


2

Я щойно стикався з цією проблемою з об’єктами, згенерованими csv-аналізатором з файлу CSV, який був створений MS Excel. Мені вдалося отримати доступ до всіх властивостей, окрім першої властивості - але це виявиться нормально, якби я записав весь об’єкт за допомогою console.log.

Виявилося, що формат CSV UTF-8 вставляє 3 байти (ef bb bf) на початку, що відповідає невидимому символу - які були включені як частину першого заголовка властивості csv-аналізатором. Рішення полягало в повторному генеруванні CSV, використовуючи параметр, який не є UTF, і це усувало невидимий символ.


Ти герой! Дякуємо, що опублікували це. Я витягнув волосся.
Jordan S

Ще раз дякую за публікацію! Врятував мою ніч!
Олівер Хікман

2

У мене була подібна проблема, сподіваюся, що наступне рішення комусь допоможе.
Тут ви можете використовувати 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

});

2

якщо ви використовуєте TYPESCRIPTта / або ANGULAR, це може бути це!

.then((res: any) => res.json())

встановивши тип відповіді на будь-яку виправлену для мене проблему, я не міг отримати доступ до властивостей відповіді, поки не встановив res: any

див. це питання Властивість '_body' не існує у типі 'Відповідь'


1

У мене був той самий питання, і рішення, яке було вище, не працювало для мене, і це відчувало, як потім здогадуватися. Однак перетворення мого коду, який створює об'єкт у 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
});

1

У мене було подібне питання або, можливо, просто пов'язане.

У моєму випадку я мав доступ до властивостей об'єкта, але одна не була визначена. Я виявив, що проблема була пробілом у коді на стороні сервера під час створення ключа, val об'єкта.

Мій підхід був такий:

створюючи мій об’єкт ... помічайте пробіл у "слові"

відповідь, яку я отримую від мого API REST

javascript-код для реєстрації значень

результати журналу з консолі

Після видалення пробілу з коду на сервері, що створює об'єкт, я міг отримати доступ до властивості, як показано нижче ...

результат після видалення пробілів

Це не може бути проблемою у випадку предметного питання, але це було для мого випадку, а може бути таким і для когось іншого. Сподіваюся, це допомагає.


1

У мене щойно виникла проблема з документом, завантаженим з MongoDB за допомогою Mongoose.

Виявилося, що я використовую властивість find()повертати тільки один об'єкт, тому я змінив , find()щоб findOne()і все працювало для мене.

Рішення (якщо ви використовуєте Mongoose): Переконайтеся, що повертаєте лише один об’єкт, щоб ви могли розібрати його, object.idабо він буде розглядатися як масив, тому вам потрібно отримати доступ до нього таким чином object[0].id.


1

Для мене це виявилося проблемою, пов’язаною з мангустом.

Я перекидався предметами, які я отримав із запиту Монго. Мені просто довелося видалити:

items = await Model.find()

І замініть його на:

items = await Model.find().lean()

0

У мене виникла така проблема, і я виявив, що рішення стосується 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 навколо об'єкта, і початкова налагодження лежала мені.


0

У мене була аналогічна проблема (при розробці для 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);
    }
});

0

На випадок, якщо це комусь корисно, у мене була подібна проблема, і це тому, що хтось створив переопрацювання для .toJSON в об’єкті, з яким я працював. Тож об’єкт був чимось на кшталт:

{
  foo: {
         bar: "Hello"
         baz: "World"
       }
}

Але .toJSON () був:

toJSON() {
  return this.foo
}

Тож коли я зателефонував у JSON.stringify (myObject), він повернувся "{" bar ":" Hello "," baz ":" World "}". Однак Object.keys (myObject) виявив "foo".


toJson()це той пункт, про який тут ніхто не згадував. Я не знаю, чому цю відповідь було оскаржено, оскільки це спосіб створити об'єкт, який має інше значення, ніж це представлення json або консолі. Я не знав, що він існує, поки я не розкрив його в іншій відповіді, і я вважаю, що цю відповідь слід підтримати, оскільки це питання слід розглядати з цими типами питань.
Rick Love

Враховуючи кількість відповідей, які мають рівно 0 балів, я думаю, що хтось просто перейняв все, не сприймаючи все.
emote_control

0

Я зіткнувся з тією ж проблемою і сьогодні. У моєму випадку ключі були вкладені, тобто key1.key2. Я розділив ключі за допомогою split (), а потім застосував позначення квадратних дужок, які працювали для мене.

var data = {
    key1: {
          key2: "some value"
       }
}

Я розділив ключі і використав це так, дані [key1] [key2], які зробили роботу для мене.


0

У мене було таке ж питання і сьогодні. Проблема була викликана uglify-js. Після того, як я виконав таку ж проблему, що не використовується, код було вирішено. Видалення

--mangle-props

від uglify-js було достатньо, щоб працював невдалий код.

Можливо, найкраща практика - використовувати якийсь префікс для властивостей, які повинні бути керовані правилом регулярного вираження для 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)

0

Жоден з JSON Strify / синтаксичного аналізу не працював на мене.

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 );

0

Я також стикався з цією проблемою, і короткий короткий опис мого API повертав тип рядка, а не JSON. Таким чином, це виглядало точно так само, коли ви надрукували його до журналу, проте, коли я намагався отримати доступ до властивостей, він давав мені невизначену помилку.

Код API:

     var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
     return Json(response);

раніше я тільки повертався:

return Json(string Of object);

0

У мене було подібне питання сьогодні в React. Врешті-решт зрозумів, що проблема викликана тим, що держава ще не встановлюється. Я дзвонив, user.user.nameі, хоча він відображався на консолі, я не міг, мабуть, отримати доступ до нього в своєму компоненті, поки не включив чек, щоб перевірити, чи user.userвстановлено, а потім подзвонив user.user.name.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.