2013-04-23 62 views
1

我正在大型數據集上運行腳本以擴展現有信息。 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。

+0

a)不要在數組中使用for-in-loop b)在js對象上不可能有重複的屬性。你的JS引擎錯誤(你使用哪一個)?你究竟如何得到這個輸出? – Bergi 2013-04-23 14:47:04

+0

@Bergi - 我相信JS引擎不是越野車。主要是因爲沒有JS引擎會包含這樣一個愚蠢的錯誤。其次,因爲JS對象通常以紅黑樹或散列表的形式實現,從而防止兩個字段具有相同的名稱。 – 2013-04-23 15:00:08

+1

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

回答

1

我真的不知道你的問題。如果將相同的屬性名稱應用於ECMAscript中的對象,則該屬性將被覆蓋。你的代碼片段中的結構永遠不會以活動對象(不包括JSON字符串)的形式存在。

如果你只是想檢測嘗試創建一個屬性,它已經在那兒了,你要麼需要有一個對象引用預先緩存(這樣你就可以循環它的鍵) - 或 - 您需要申請ES5嚴​​格模式

"use strict"; 

位於文件或函數的頂部。這將確保您的解釋器將嘗試創建兩個相同的屬性鍵時拋出異常。 您當然可以使用 try - catch語句來攔截那個失敗。

好像你不能攔截因爲違反嚴格模式違規而拋出的錯誤