我正在大型數據集上運行腳本以擴展現有信息。 e.g:從單個賦值操作避免重複的JS對象屬性?
...
{
id : 1234567890
},
{
id : 1234567891
},
...
成爲
...
{
id : 1234567890,
Name : "Joe"
},
{
id : 1234567891,
Name : "Bob"
},
...
我通過下面的代碼實現這一點:
for(var cur in members)
{
curMember = members[cur];
// fetch account based on curMember.id to 'curAccount'
if(curAccount != null)
{
curMember.DisplayName = curAccount.DisplayName;
}
}
在大多數情況下,這種按預期工作。然而,在一段時間後(在數萬項的順序),結果是這樣的:
...
{
id : 1234567891,
Name : "Bob",
Name : "Bob"
},
...
我現在已經是一個無效的格式,無法通過數據庫來讀取數據,因爲重複的屬性名稱沒有意義。腳本重新運行時發生隨機輸入,而不是每次都是相同的。我需要一種方法來防止這種情況發生,或者檢測到它發生了,所以我可以簡單地重新處理條目。任何人都知道這裏發生了什麼?
編輯:進一步調查後,只有當被修改的對象來自MongoDB查詢時,纔會出現問題。看起來,如果代碼顯式地將一個值設置爲相同的元素名稱多次,該字段將被複制。所有相同名稱的元素似乎都設置爲最近指定的值。如果僅在我的原始問題中分配一次,則只會極少重複。我正在使用MongoDB 2.4.1。
a)不要在數組中使用for-in-loop b)在js對象上不可能有重複的屬性。你的JS引擎錯誤(你使用哪一個)?你究竟如何得到這個輸出? – Bergi 2013-04-23 14:47:04
@Bergi - 我相信JS引擎不是越野車。主要是因爲沒有JS引擎會包含這樣一個愚蠢的錯誤。其次,因爲JS對象通常以紅黑樹或散列表的形式實現,從而防止兩個字段具有相同的名稱。 – 2013-04-23 15:00:08
a)感謝您的提示,將改變它 b)我意識到這應該是完全不可能的,沒有意義!我在使用ES5的MongoDB 2.4.1上運行它。詳情:http://docs.mongodb.org/manual/release-notes/2.4-javascript/。循環結束後但在提交回數據庫之前,我通過printjson(成員)獲得輸出。 – Kevin 2013-04-23 15:02:00