2015-07-04 89 views
1

我試圖找到一個關鍵值對值,但我想通過鍵作爲參數,但它似乎並沒有工作。使用函數參數來查找和對象鍵值對?

function drawPieChart(){ 

var findData = function(variable){ 
    return dailyLog.find({createdBy: Meteor.user().username}, {fields: {variable: 1}}).fetch()[0].variable; 
}; 

var data = [ 
    { 
     value: findData(adherence), 
     color: "#CBDDE7" 
    }... 

我想變量在傳遞兩次,一次排序等找到值,但它實際上是在尋找鍵值對「變量」,這顯然是不存在的。

我如何讓它被視爲參數?

回答

3

有兩個方面是:

  1. 創建等領域的名字對象的屬性是variable而不是字面名稱variable值,並根據

  2. 訪問所產生的場對變量的值(而不是文字名稱variable

首先處理#2是因爲它更簡單:在JavaScript中,可以使用點符號和屬性名稱文字(obj.foo)或使用括號表示法和屬性名稱字符串 *(obj["foo"])訪問對象的屬性。在後一種情況下,字符串可以是任何表達式的結果,包括變量查找。因此,如果variable包含"foo",那麼obj[variable]將在obj上獲取或設置foo屬性。

回到#1:現在,你必須創建你打算通過支架符號,而不是一個對象初始化通過爲fields第一,然後分配屬性值的對象:

var fields = {}; 
    fields[variable] = 1; 

如果variable包含"foo",則fields[variable] = 1foo屬性設置爲fields1

所以把所有在一起:

var findData = function(variable){ 
    var fields = {}; 
    fields[variable] = 1; 
    return dailyLog.find({createdBy: Meteor.user().username}, {fields: fields}).fetch()[0][variable]; 
    // Note ------------------------------------------------------------------------------^--------^ 
}; 

在JavaScript中,ECMAScript6(又名ES6)的下一個版本,你就能夠做到#1的 「計算屬性名」對象初始值設定項(並用括號表示法檢索它)。也許不出所料,計算屬性名稱使用......括號!

// ES6 only!! 
var findData = function(variable){ 
    return dailyLog.find({createdBy: Meteor.user().username}, {fields: {[variable]: 1}}).fetch()[0].[variable]; 
    // Note ------------------------------------------------------------^--------^ --- and ---------^--------^ 
}; 

*附註:在ES6,支架符號可以用東西叫做Symbols以及字符串中使用。這是不相關的問題,但我說:「串」上,很快,不會是真的,那麼......

+0

+1這一點。如果你不知道你會在一個對象提前致電物業,說,如果這是一個從參數的方法,你需要使用支架'[變量]'符號,而不是點'.variable'符號。 – OceansOnPluto

+1

@ T.J.Crowder哥們,非常感謝!完美解決它,我很高興,完美的作品!謝謝!! –