Цель
Я пытаюсь создать алгоритм Round Robin (https://en.wikipedia.org/wiki/Round-robin_scheduling) в чисто функциональном ключе.
Эта функция, как предполагается, получает массив, подобный следующему:
[
[ 1, 2 ],
[ 3, 4 ]
]
И произведите следующий вывод:
[ 1, 3, 2, 4 ]
код
Чтобы достичь этого, я решил рекурсивно реализовать циклический цикл, как показано ниже:
const roundRobin = (arr, results) => {
if (arr.length === 0) return results;
const newResults = arr.reduce((acc, current) => {
if (current.length > 0) {
acc.results.push(current.shift());
acc.arr.push(current);
}
return acc;
}, { arr: [], results });
return roundRobin(newResults.arr, newResults.results);
};
Здесь я чувствую массу результатов, и я заканчиваю, когда мне нечего добавить к нему. Использовать этот код можно следующим образом:
const array = [
[ 1, 2 ],
[ 3, 4 ]
];
const result = roundRobin( array, [] );
Проблема
В моем коде я использую reduce
в моем параметре arr
, чтобы убедиться, что я не изменяю оригинал. Однако, если я печатаю массив перед использованием roundRobin и после, переменная изменяется! Я как-то мутирую его!
Вопросы:
- Если я использую сокращение, которое является чистым, как я изменяю свои параметры?
- Есть ли еще один чистый/функциональный способ реализации roundRobin?