мне кажется достаточно одной функции: если есть пересечения - удаляем, если нет - добавляем.
на практике у меня немного другая задача но думаю я бы справился увидь я пример нормальный на ес6)
у меня такая задача
const totalSelected = [1,2,3,4,5];
const localSelected = [1,2];
const localAvailable = [1,2,3,4];
и у меня задача написать функцию которая будет обновлять totalSelected исходя из изменений localSelected - я логику вижу следующим образом:
1) если localSelected изменилась в сторону добавления новых значений (из localAvailable разумеется) - добавить таковые в totalSelected (проверя если их там уже нету)
2) если localSelected изменилась в сторону уменьшения - пройтись по localAvailable и удалить из totalSelected те значения которые там остались но не остались в localSelected
вот это всё бы максимально коротко написать)