зеркало из https://github.com/mozilla/gecko-dev.git
39 строки
1.1 KiB
JavaScript
39 строки
1.1 KiB
JavaScript
/* 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"];
|