JSON.stringify与直接访问对象属性strongloop不同

时间:2015-08-21 21:57:32

标签: javascript json 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 个答案:

答案 0 :(得分:1)

您的item对象可能已实施toJSON function

弹出浏览器的控制台并运行此代码片段以查看如何在字符串化的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是一个非常昂贵的功能。