Package Exports
- @indutny/sneequals
- @indutny/sneequals/dist/esm/src/index.js
- @indutny/sneequals/dist/src/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@indutny/sneequals) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
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/sneequals@1.3.5 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.