2015-10-05 66 views
2

我以包含嵌套對象(〜34,000項)的大數組開始,並且每5秒輪詢一次,接收數組的更新(通常爲2-3一次更新),新陣列只包含已更改的項目(例如,如果只有3個項目發生更改,我只能獲得更新陣列中的這3個項目。)JavaScript中的快速方式用新值更新現有陣列

我嘗試了下列使用下劃線,但它需要9秒,我需要一秒鐘或更少。

getUniqueUnion(new, old) { 
    return uniq(union(new, old), false, function(item) { 
     return item.info.id; 
    }); 
    } 

任何人都有一個快速方法的建議嗎?如果有幫助,唯一的關鍵是info.id,而我真正想要檢測的唯一更改(原因是我需要更新該項目)是否inStock值發生變化。換句話說,如果inStock值沒有改變,我不需要對該數組項進行任何更新。

實例陣列:

const originalData = [ 
    { 
    info: { 
     id: 1 
    }, 
    moreInfo: { 
     name: 'hamburger', 
     inStock: true 
    } 
    }, 
    ... // 33,999 more 
] 



const updatedData = [ 
    { 
    info: { 
     id: 1 
    }, 
    moreInfo: { 
     name: 'hamburger', 
     inStock: false 
    } 
    }, 
    ... // maybe 2 more 
] 

所以最終的陣列將包括有moreInfo.inStock ===第一項虛假

+2

如果您知道需要更新的條目的id,應該查找「id」,然後更新*只有該條目*而不是重新寫入整個陣列 –

+0

是id的順序?他們從1開始到34000,還是更隨機? –

+0

我想我太過於複雜了,我可以在for循環中使用for循環並更改該條目,而不是重寫,謝謝@HunterMcMillen。 – Ben

回答

1

閱讀您的情況後,這裏是我的建議:

  1. 排序的大陣。你只需要一次,所以不用擔心。在排序的數組中查找值總是比未排序的數組更快更容易。
  2. 循環使用您的updatedData,取一個項目,在您的排序數組中尋找它(originalData),使用二進制搜索。根據需要更新它。

要了解如何在JavaScript中實現二進制搜索,您可以參考此post或此one

0

我肯定是過於複雜這一點。這是我提出的解決方案,但如果有人知道更快的事情,我會很感激。

function updateArray(latest, current) { 
    for (let i = 0, len = current.length; i < len; i++) {  
    for (let g = 0, len = latest.length; g < len; g++) { 
     if (latest[g].module.id === current[i].module.id) { 
     current[i] = latest[g]; 
     break; 
     } 
    } 
    } 

    return current; 
} 
+0

如果'latest'和'current'的長度是相似的,那麼這個速度仍然很慢'O(n^2)'(假設n接近於m。你可以使用二分搜索來查找你需要在'O(log n)'時間而不是'O(n)'中更新的元素 –

+0

因爲info.id是唯一的,所以爲什麼不用一個散列?要做的是通過最新的數組,並簡單地覆蓋當前散列中的匹配條目。 – subdigit

+0

'latest'將會非常小,比如1-3個元素 – Ben