@indutny/sneequals
v4.0.0
Published
Sneaky equality check between objects using proxies
Downloads
2,389
Readme
@indutny/sneequals
Sneaky equals comparison between objects that checks only the properties that were touched.
Heavily inspired by proxy-compare.
Installation
npm install @indutny/sneequals
Usage
import { watch } from '@indutny/sneequals';
const originalData = {
nested: {
prop: 1,
},
avatar: {
src: 'image.png',
},
};
const { proxy, watcher } = watch(originalData);
function doSomethingWithData(data) {
return {
prop: data.nested.prop,
x: data.avatar,
};
}
const result = watcher.unwrap(doSomethingWithData(proxy));
// Prevent further access to proxy
watcher.stop();
const sneakyEqualData = {
nested: {
prop: 1,
other: 'ignored',
},
avatar: original.avatar,
};
console.log(watcher.isChanged(originalData, sneakyEqualData)); // false
const sneakyDifferentData = {
nested: {
prop: 2,
},
avatar: {
...original.avatar,
},
};
console.log(watcher.isChanged(originalData, sneakyDifferentData)); // true
Benchmarks
On M1 Macbook Pro 13:
% npm run bench -- --duration 30 --ignore-outliers
> @indutny/[email protected] bench
> bencher dist/benchmarks/*.js
isChanged: 4’336’043.2 ops/sec (±28’636.7, p=0.001, o=5/100)
isNotChanged: 7’830’106.8 ops/sec (±53’241.7, p=0.001, o=1/100)
memoize: 7’632’437.7 ops/sec (±49’917.5, p=0.001, o=1/100)
watch+unwrap: 738’642.1 ops/sec (±3’396.8, p=0.001, o=3/100)
Credits
- Based on proxy-compare by dai-shi
- Name coined by Scott Nonnenberg.
LICENSE
This software is licensed under the MIT License.