session-desktop/libloki/service_nodes.js

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