mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			36 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
	
		
			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/. */
 | 
						|
 | 
						|
export 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()));
 | 
						|
  }
 | 
						|
}
 |