You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
| /* global window */
 | |
| 
 | |
| // eslint-disable-next-line func-names
 | |
| (function() {
 | |
|   window.libloki = window.libloki || {};
 | |
| 
 | |
|   function consolidateLists(lists, threshold, selector = x => x) {
 | |
|     if (typeof threshold !== 'number') {
 | |
|       throw Error('Provided threshold is not a number');
 | |
|     }
 | |
|     if (typeof selector !== 'function') {
 | |
|       throw Error('Provided selector is not a function');
 | |
|     }
 | |
| 
 | |
|     // calculate list size manually since `Set`
 | |
|     // does not have a `length` attribute
 | |
|     let numLists = 0;
 | |
|     const occurences = {};
 | |
|     const values = {};
 | |
|     lists.forEach(list => {
 | |
|       numLists += 1;
 | |
|       list.forEach(item => {
 | |
|         const key = selector(item);
 | |
|         if (!(key in occurences)) {
 | |
|           occurences[key] = 1;
 | |
|           values[key] = item;
 | |
|         } else {
 | |
|           occurences[key] += 1;
 | |
|         }
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     const scaledThreshold = numLists * threshold;
 | |
|     return Object.keys(occurences)
 | |
|       .filter(key => occurences[key] >= scaledThreshold)
 | |
|       .map(key => values[key]);
 | |
|   }
 | |
| 
 | |
|   window.libloki.serviceNodes = {
 | |
|     consolidateLists,
 | |
|   };
 | |
| })();
 |