2015-08-21 83 views
1

我使用strongloop構建我的api。 在特定的路線上,查詢包括模型的關係。我收到了一些我想要安排的對象。 在這個特定的排列功能中,我面臨以下問題。 函數接收名爲「item」的對象,其中包含「trans」字段(該字段是另一個對象的數組)。 這段代碼:JSON.stringify與直接訪問對象屬性不同,strongloop

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是undpined「當我嘗試這段代碼:

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

我怎麼能簡單地訪問在這種情況下,「反式」屬性來獲取裏面的文本? (不是很容易在js) 在此先感謝。

回答

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

當然,最簡單的解決將是解析字符串化結果:

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

這是最後一案情節類型的解決方案,T因爲JSON.stringify是一個非常昂貴的函數。

+0

嗨, 非常感謝!這工作。在找到更有效的解決方案之前,我會將其用作臨時解決方案。 – valvince

+0

@valvince你找到了更好的解決方案嗎? – Casy