Хобрук: Ваш путь к мастерству в программировании

JSON.stringify отличается от прямого доступа к свойству объекта, strongloop

Я использую strongloop для создания своего API. На конкретном маршруте запрос включает отношения модели. Я получаю массив объектов, которые я хотел бы упорядочить. В этой конкретной функции аранжировки я сталкиваюсь со следующей проблемой. Функция получает объект с именем «item», содержащий поле «trans» (это поле является массивом другого объекта). этот кусок кода:

console.log(JSON.stringify(item, null, 2));

производит этот результат:

{
  "id": 1,
  "created": "2015-08-19T21:04:16.000Z",
  "updated": null,
  "authorid": 0,
  "likes": 0,
  "shares": 0,
  "fav": 0,
  "validated": 0,
  "comments": 0,
  "trans": [
    {
      "text": "Première question en français",
      "questionId": 1
    }
  ],
  "answers": [
    {
      "id": 1,
      "questionid": 1,
      "questionId": 1,
      "trans": [
        {
          "text": "q1 : reponse 1 en francais",
          "answerId": 1
        }
      ]
    },
    {
      "id": 2,
      "questionid": 1,
      "questionId": 1,
      "trans": [
        {
          "text": "q1 : reponse 2 en francais",
          "answerId": 2
        }
      ]
    }
  ]
}

Эта проблема возникает, когда я пытаюсь добраться до этой части:

item.trans[0].text

консоль говорит "item.trans не определен", и когда я пробую этот фрагмент кода:

console.log(item.trans);

У меня есть этот результат:

function (condOrRefresh, options, cb) {
    if (arguments.length === 0) {
      if (typeof f.value === 'function') {
        return f.value(self);
      } else if (self.__cachedRelations) {
        return self.__cachedRelations[name];
      }
    } else {
      if (typeof condOrRefresh === 'function'
        && options === undefined && cb === undefined) {
        // customer.orders(cb)
        cb = condOrRefresh;
        options = {};
        condOrRefresh = undefined;
      } else if (typeof options === 'function' && cb === undefined) {
        // customer.orders(condOrRefresh, cb);
        cb = options;
        options = {};
      }
      options = options || {}
      // Check if there is a through model
      // see https://github.com/strongloop/loopback/issues/1076
      if (f._scope.collect &&
        condOrRefresh !== null && typeof condOrRefresh === 'object') {
        //extract the paging filters to the through model
        ['limit','offset','skip','order'].forEach(function(pagerFilter){
            if(typeof(condOrRefresh[pagerFilter]) !== 'undefined'){
                f._scope[pagerFilter] = condOrRefresh[pagerFilter];
                delete condOrRefresh[pagerFilter];
            }
        });
        // Adjust the include so that the condition will be applied to
        // the target model
        f._scope.include = {
          relation: f._scope.collect,
          scope: condOrRefresh
        };
        condOrRefresh = {};
      }
      return definition.related(self, f._scope, condOrRefresh, options, cb);
    }
  } 

Как я могу просто получить доступ к свойству «trans» в этом случае, чтобы получить текст внутри? (Не очень легко в js) Заранее спасибо.


Ответы:


1

Возможно, ваш объект item реализовал toJSON.

Откройте консоль браузера и запустите этот фрагмент, чтобы увидеть пример того, как это может иметь значение между строковым JSON и фактическим объектом:

var x = {

  name: "foo",

  children : function() {
    return [ { name: 'child 1' }, { name: 'child 2' } ];
  },
  
  toJSON: function() {
    var simplified = { name: this.name, children: this.children() };
    
    return simplified
  }

};

// shows children as a simple array
console.log( JSON.stringify( x, null, 2 ) );
// {
//   "name": "foo",
//   "children": [
//     {
//       "name": "child 1"
//     },
//     {
//       "name": "child 2"
//     }
//   ]
// }

// oops... not what you expected
console.log( x.children[0].name );
// Uncaught TypeError: Cannot read property 'name' of undefined

Конечно, самым простым решением было бы проанализировать результат stringify:

var y = JSON.parse( JSON.stringify( x ) );
console.log( y.children[0].name );

Однако это решение типа сценария в последнем случае, поскольку JSON.stringify — очень дорогая функция.

21.08.2015
  • Привет! Большое спасибо! Это сработало. Я буду использовать его как временное решение, пока не найду более эффективное решение. 22.08.2015
  • @valvince ты нашел лучшее решение? 01.11.2017
  • Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..