TL; DR版本:我想避免將重複的Javascript對象添加到類似對象的數組中,其中一些對象可能非常大。什麼是最好的方法?檢查重複的Javascript對象
我有一個應用程序,我將大量的JSON數據加載到Javascript數據結構中。雖然這是比這更復雜一點,假設我加載JSON成JavaScript對象從服務器陣列通過一系列的AJAX請求,類似的:
var myObjects = [];
function processObject(o) {
myObjects.push(o);
}
for (var x=0; x<1000; x++) {
$.getJSON('/new_object.json', processObject);
}
更復雜的是,該JSON:
- 處於未知模式
- 是任意長度的(可能不是巨大的,但可能是在100-200 kb的範圍內)
- 可能包含在不同的請求重複
我最初的想法是有一個額外的對象來存儲每個對象的哈希(通過JSON.stringify
?)和對證每個負載,就像這樣:
var myHashMap = {};
function processObject(o) {
var hash = JSON.stringify(o);
// is it in the hashmap?
if (!(myHashMap[hash])) {
myObjects.push(o);
// set the hashmap key for future checks
myHashMap[hash] = true;
}
// else ignore this object
}
,但我很擔心有myHashMap
中的屬性名稱可能長度爲200 kb。所以我的問題是:
- 有沒有比hashmap想法更好的方法來解決這個問題?
- 如果沒有,是否有更好的方法來爲任意長度和架構的JSON對象創建散列函數的功能比
JSON.stringify
? - 對象中超長屬性名稱可能存在的問題是什麼?
你控制服務器嗎?任何方式來添加一個唯一的ID到你的對象,你可以關掉? –
我同意SB。每個對象的某種唯一鍵會使這個微不足道。問題是否可以重新考慮數據的來源以創建這樣一個關鍵?如果做不到這一點,你能否確定一個唯一標識它的對象屬性的小主題,如果它們是相同的,那麼你可以認爲該對象是相同的,並使得你的散列不在屬性的子集中? – jfriend00
@SB,@ jfriend00 - 一個唯一的ID會讓這變得更容易,但由於各種原因,這是不可行的。假設我不控制服務器,並且對象的模式完全是黑框的(再一次,它稍微複雜一點,但實際情況就是這樣)。 – nrabinowitz