我正在使用這種方法來比較兩個非常大的物件陣列以創建結果陣列。
這些陣列可以有 5 到 250,000 個物件,每個物件有 8 個屬性。屬性都是字串(最多 256 個字符)和整數。
創建包含 250,000 個物件的結果陣列需要 15 多分鐘。
意識到計算機、記憶體、月相等都是因素,我一直在尋找更快/更好的方法。
任何建議表示贊賞:)
const arr1 = [{prop1: "foo", prop2: 100},{prop1: "bar", prop2: 101}] // 250,000 objects
const arr2 = [{prop1: "foo", prop2: 50},{prop1: "bar", prop2: 51}] // 250,000 objects
let final = []
for(let left of arr1) {
for(let right of arr2) {
if(left.prop1 === right.prop1 && left.prop2 < right.prop2) {
final.push(left)
break
}
}
}
}
uj5u.com熱心網友回復:
一種會消耗更多記憶體但運行時間更短的方法是將其中一個陣列轉換為物件或 Map 索引prop1。這樣,無需遍歷每個元素以查看它是否匹配,只需查找該元素的元素即可prop1。
const arr2ByProp1 = new Map();
for (const item of arr2) {
arr2ByProp1.set(item.prop1, item);
}
for (const item1 of arr1) {
const item2 = arr2ByProp1.get(item1.prop1);
if (item2 && item1.prop2 < item2.prop2) {
final.push(item1);
}
}
您也可以調整上面的內容以for(let i = 0, length = arr1.length; i < length; i ) {代替使用(稍微快一點,但一目了然地閱讀和理解有點困難)。可能會進行其他小的調整,但與時間復雜度的改進相比,它們應該不會有太大的影響。
不過,開始時記憶體中有 250k 項是值得懷疑的。如果它們在資料庫中,則查詢資料庫(可以通過.prop1and.prop2查找)以查找這些匹配項可能比在 JavaScript 中進行操作(這需要首先重組整個資料結構之一)快得多,效率不高)。與 JavaScript 的這種特殊情況不同,資料庫也可以利用并行執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/444797.html
標籤:javascript 节点.js
上一篇:從API過濾每個引數值
下一篇:NodeJS中的強化學習?
