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,
 | 
						|
  };
 | 
						|
})();
 |