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

JSON.stringify different from direct access to object property, 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 is undifined" 当我尝试这段代码时:

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 中并不容易) 提前致谢。

您的 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

当然,最简单的解决方法是解析字符串化结果:

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

不过,这是最后一种情况类型的解决方案,因为 JSON.stringify 是一个非常昂贵的函数。