I do something similar for my redux reducers... I create an update object, then merge it with my original state with a shallow spread. I also use a deep merge function I wrote for rolling up partial application of configurations for different clients/environments.