diff options
Diffstat (limited to 'browser/components/newtab/common/Dedupe.jsm')
-rw-r--r-- | browser/components/newtab/common/Dedupe.jsm | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/browser/components/newtab/common/Dedupe.jsm b/browser/components/newtab/common/Dedupe.jsm new file mode 100644 index 0000000000..280615ba6a --- /dev/null +++ b/browser/components/newtab/common/Dedupe.jsm @@ -0,0 +1,38 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +this.Dedupe = class Dedupe { + constructor(createKey) { + this.createKey = createKey || this.defaultCreateKey; + } + + defaultCreateKey(item) { + return item; + } + + /** + * Dedupe any number of grouped elements favoring those from earlier groups. + * + * @param {Array} groups Contains an arbitrary number of arrays of elements. + * @returns {Array} A matching array of each provided group deduped. + */ + group(...groups) { + const globalKeys = new Set(); + const result = []; + for (const values of groups) { + const valueMap = new Map(); + for (const value of values) { + const key = this.createKey(value); + if (!globalKeys.has(key) && !valueMap.has(key)) { + valueMap.set(key, value); + } + } + result.push(valueMap); + valueMap.forEach((value, key) => globalKeys.add(key)); + } + return result.map(m => Array.from(m.values())); + } +}; + +const EXPORTED_SYMBOLS = ["Dedupe"]; |