我在 javascript 中使用 Maps 作業了很多。我需要最有效的計算方法來查找地圖 a 中不存在于地圖 b 中的所有專案。例如,
const a = new Map();
a.set('item1', 'item1value');
a.set('item2', 'item2value');
const b = new Map();
b.set('item1', 'item1value');
我要撰寫的函式的結果將是另一個 Map,只有一個 key: item2, value:條目item2value。
我很清楚使用陣列和物件執行此操作的大量問題/答案/方法,但是我還沒有看到對地圖的這種解釋。我需要絕對最有效的方法來做到這一點,因為我需要快速呼叫這個函式多達數千次。轉換為陣列并回傳到 Map 是最好的方法嗎?地圖有什么技巧可以幫助嗎?
uj5u.com熱心網友回復:
不,不要將映射轉換為陣列并回傳。計算陣列之間的差異很慢,在地圖中您需要O(1)查找。通過對專案只是圈a,并把它們進入的結果,如果你沒有找到一個等效的條目b。這將具有最佳時間復雜度O(n)(其中n是地圖的大小a)。
const result = new Map();
for (const [k, v] of a) {
if (v === undefined && !b.has(k) || b.get(k) !== v) {
result.set(k, v);
}
}
如果您知道您的地圖不包含undefined值,您可以v === undefined && !b.has(k) ||完全省略并且可能會獲得一些加速。另外,請注意,如果您的地圖可以包含NaN值,您將需要使用Object.is代替===。
如果你想把它寫成一個單一的花哨的運算式,考慮一個生成器:
const result = new Map(function*() {
for (const e of a) {
const [k, v] = e;
if (v === undefined && !b.has(k) || b.get(k) !== v) {
yield e;
}
}
}());
uj5u.com熱心網友回復:
您可以迭代第一張地圖并檢查第二張地圖。
const
a = new Map([['item1', 'item1'], ['item2', 'item2']]),
b = new Map([['item1', 'item1']]),
difference = (a, b) => {
const d = new Map;
a.forEach((v, k) => {
if (!b.has(k) || b.get(k) !== v) d.set(v, k);
});
return d;
}
console.log([...difference(a, b)])
uj5u.com熱心網友回復:
也許像這樣通過維護a;
var a = new Map(),
b = new Map(),
c;
a.set('item1', 'item1value');
a.set('item2', 'item2value');
b.set('item1', 'item1value');
c = new Map(a);
b.forEach((_,k) => c.delete(k));
console.log(c); // try in dev tools to see result
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/399366.html
標籤:javascript 表现 ecmascript-6 放 差集
