Хорошо, ваш вопрос был неясен, но чтение кода имеет смысл. Работодатели могут взаимодействовать с клиентами с настроением ниже их квалификации, но они не могут взаимодействовать с клиентом, с которым может взаимодействовать и другой сотрудник с более низким уровнем квалификации. Давайте решим это.
С одной стороны, нет особого смысла фильтровать, затем копировать результат этого в набор, а затем запускать другой фильтр, где вы отфильтровываете все, что только что отфильтровали. Звучит как беспорядок, верно? Это.
Вместо этого просто создайте свой набор изначально для всех клиентов. Затем запустите forEach и удалите клиентов из набора, которые могут обслуживать самые мелкие работники, увеличивая счетчик для каждого клиента, для которого вы делаете это. Вы на самом деле не отправляли идентификаторы клиентов вместе с рассылкой, поэтому нет смысла вообще их использовать.
Алгоритм будет примерно таким:
Сортировка сотрудников и клиентов в соответствии с навыком и настроением.
Создайте переменную счетчика.
Итерация по клиентам.
Для каждого клиента, если его настроение <навык текущего сотрудника, увеличьте счетчик.
Если нет, сохраните счет в вашем дистрибутиве вместе с текущим идентификатором сотрудника. Затем перейдите к следующему идентификатору сотрудника. </p>
Повторите. На самом деле не получил шанс использовать набор. Я не думаю, что они заказали. Это работает хорошо, хотя, и вы можете сделать это за один проход после сортировки.
function countEmployersByMoodAtt(operators, customers) {
console.log("Sorting operators.");
operators.sort((a, b) => a[1] - b[1]);
console.log("Sorting customers");
customers.sort((a, b) => a[1] - b[1]);
console.log("Starting processing.");
let distribution = [];
let opIndex = 0;
let customersServed = 0;
let bestEmployeeID;
let mostServed = -1;
let skill = operators[opIndex][1];
for (let i = 0; i < customers.length; ++i) {
let mood = customers[i][1];
if (mood < skill)
++customersServed;
else {
// check if new record.
if (customersServed > mostServed) {
mostServed = customersServed;
bestEmployeeID = operators[opIndex][0];
customersServed = 1; // this will count toward the employee found in while() loop.
}
// find next qualified employee.
while (mood > skill && ++opIndex < operators.length) {
skill = operators[opIndex][1];
}
// no employees can serve customer.
if (opIndex >= operators.length) {
console.log("No employees skilled enough for remaining customers.")
return [bestEmployeeID, mostServed];
}
}
}
// need to do this one more time for the last set of customers.
// because 'else' case won't run if customer is served adequately.
// and if a new employee is selected for the last customer, bestEmployee won't be set.
if (customersServed > mostServed) {
mostServed = customersServed;
bestEmployeeID = operators[opIndex[0]];
}
return [bestEmployeeID, mostServed];
}