clean-set

Quickly update a value in a deeply nested object and clone each node touched for simple change tracking ===
.
Check out dset if you just want to do an in place mutation on a deeply nested value.
Install
npm i clean-set
Includes builds for commonjs, umd, and esm and is less than 200b 182b gzip (thanks to @lukeed)
Usage
let current = {
a: { b: [], c: true },
d: [],
e: {
f: { g: 'hello' },
h: { i: 0 },
},
};
let next = cleanSet(current, 'e.h.i', 1);
console.log(next.e.h.i !== current.e.h.i);
console.log(next.e.h !== current.e.h);
console.log(next.e !== current.e);
console.log(next !== current);
console.log(next.e.f === current.e.f);
console.log(next.a === current.a);
console.log(next.a.b === current.a.b);
console.log(next.d === current.d);
Here's what an object spread equivalent would look like.
let next = {
...current,
e: {
...current.e,
h: { ...current.e.h, i: 1 },
},
};
Benchmarks
Check out the es bench link to run the benchmarks yourself.
Note: YMMV canary and firefox dev have some impressive improvements for object assign and object spread respectively.
Chrome 67
