2016-01-08 39 views
2

我有一些從Taffy數據庫中繪製的代碼,以創建一個對象,然後迭代。在以前的版本中,對象中元素的順序在順序上是一致的(儘管我知道這在js中是不能保證的),所以我通過this[0],this[1]等訪問它們。在新版本中(顯然是由於太妃糖臭蟲,https://github.com/typicaljoe/taffydb/issues/109),這種行爲是不可靠的,所以我想知道是否有一個更強大的方式來構造信息和檢索它。一個簡單的例子:如何將結構添加到作爲數據庫查詢結果創建的對象中

var stuffWeCite = TAFFY([{ 
"first": 1, 
"second": 2, 
"third": 3, 
"fourth": 4 
}]); 

var filterVar = {"first":1}; 
var someVar = stuffWeCite() 
.filter(filterVar) 
.select("first", "second", "third", "fourth"); 

console.log('someVar: ' + someVar); 

以前,結果會出現1,2,3,4,但行爲已經改變。

如果我逐個輸入查詢元素到一個對象中,我會爲它們分配屬性(「first」,「second」等),然後再調用它們,但它們的方式選擇似乎排除了這一點。有沒有一種方法,我可以分配屬性的值從數據庫查詢創建對象時?

回答

0

我不知道taffy,但是對於這樣的問題,我使用了一個數組幫助器,正如您所說的那樣,對象鍵的順序在javascript中不可靠。你可以聲明其保留在訂單對象的數組中的鍵,你想用,然後遍歷它來獲取從物體的順序值:

var stuffWeCite = TAFFY([{ 
    "second": 2, 
    "first": 1, 
    "fourth": 4 
    "third": 3, 
}]); 

var array = ['first', 'second', 'third', 'fourth']; 

array.forEach(function(item) { 
    console.log(stuffWeCite[item]); 
}); 

或與循環:

var stuffWeCite = TAFFY([{ 
    "second": 2, 
    "first": 1, 
    "fourth": 4 
    "third": 3, 
}]); 

var array = ['first', 'second', 'third', 'fourth']; 

for (var i = 0, l = array.length; i<l; i++) { 
    console.log(stuffWeCite[array[i]]); 
}  

對於從db接收到的一組對象進行迭代,考慮no。字段要使用小,所以沒有必要重複陣列:

var friendsInSeattle = friends({city:"Seattle, WA"}); 
var fieldsInOrder = ['id', 'gender', 'first', 'last']; 

friendsInSeattle.forEach(function(friend) { 
    console.log({ 
     fieldsInOrder[0]: friend(fieldsInOrder[0]), 
     fieldsInOrder[1]: friend(fieldsInOrder[1]), 
     fieldsInOrder[2]: friend(fieldsInOrder[2]), 
     fieldsInOrder[3]: friend(fieldsInOrder[3]) 
    }); 
}); 

當然你也可以構造對象,而你遍歷fields數組,如果你有更多的字段,或字段可能在未來改變。 希望這有助於。

+0

我正在運行一個非常小的數據庫(幾百個條目),但是這種方法不會大大增加計算開銷,因爲每個輸出元素都需要對數據庫進行多次調用?對於上下文,我以前曾經調用這個db,然後遍歷結果對象並使用'this'來打印這些值。這樣做,似乎我需要調用數據庫每個查詢160次 - 這是一個顯着的放緩? – larkvi

+0

不是真的,據我所知Taffydb是基於內存的數據庫,所以所有的操作數據庫請求等,發生在內存中,因此速度不應該有太大麻煩,因爲不會有通過電纜或硬盤等待的時間訪問。但無論如何,你仍然可以查詢一次數據庫,獲取記錄集,並迭代記錄集和字段數組。我剛剛在上面加了一個小例子。當然,有一個額外的開銷爲字段添加了另一個迭代,但我認爲它可以忽略,以獲得您想要的結果,這是肯定的事情,並且不會依賴對象鍵中的順序。 –

+0

我強烈建議不要依賴js對象鍵中的順序。它可能會讓你大吃一驚,使用不同的瀏覽器,庫等,並且它們會定期更新,而且由於對象中的關鍵順序並沒有在標準中強制執行,所以它非常不可靠,它們可以在不破壞ecma標準的情況下在下一個版本中打破它。 –

相關問題