dequal
A tiny (304B to 489B) utility to check for deep equality
This module supports comparison of all types, including Function
, RegExp
, Date
, Set
, Map
, TypedArray
s, DataView
, null
, undefined
, and NaN
values. Complex values (eg, Objects, Arrays, Sets, Maps, etc) are traversed recursively.
Important:
- key order within Objects does not matter
- value order within Arrays does matter
- values within Sets and Maps use value equality
- keys within Maps use value equality
Install
$ npm install --save dequal
Modes
There are two "versions" of dequal
available:
dequal
Size (gzip): 489 bytes
Availability: CommonJS, ES Module, UMD
dequal/lite
Size (gzip): 304 bytes
Availability: CommonJS, ES Module
| IE9+ | Number | String | Date | RegExp | Object | Array | Class | Set | Map | ArrayBuffer | TypedArray | DataView |
---|
dequal | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
dequal/lite | :+1: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
Note: Table scrolls horizontally!
Usage
import { dequal } from 'dequal';
dequal(1, 1);
dequal({}, {});
dequal('foo', 'foo');
dequal([1, 2, 3], [1, 2, 3]);
dequal(dequal, dequal);
dequal(/foo/, /foo/);
dequal(null, null);
dequal(NaN, NaN);
dequal([], []);
dequal(
[{ a:1 }, [{ b:{ c:[1] } }]],
[{ a:1 }, [{ b:{ c:[1] } }]]
);
dequal(1, '1');
dequal(null, undefined);
dequal({ a:1, b:[2,3] }, { a:1, b:[2,5] });
dequal(/foo/i, /bar/g);
API
dequal(foo, bar)
Returns: Boolean
Both foo
and bar
can be of any type.
A Boolean
is returned indicating if the two were deeply equal.
Benchmarks
Running Node v10.13.0
The benchmarks can be found in the /bench
directory. They are separated into two categories:
basic
– compares an object comprised of String
, Number
, Date
, Array
, and Object
values.complex
– like basic
, but adds RegExp
, Map
, Set
, and Uint8Array
values.
Note: Only candidates that pass validation step(s) are listed.
For example, fast-deep-equal/es6
handles Set
and Map
values, but uses referential equality while those listed use value equality.
Load times:
assert 0.109ms
util 0.006ms
fast-deep-equal 0.479ms
lodash/isequal 22.826ms
nano-equal 0.417ms
dequal 0.396ms
dequal/lite 0.264ms
Benchmark :: basic
assert.deepStrictEqual x 325,262 ops/sec ±0.57% (94 runs sampled)
util.isDeepStrictEqual x 318,812 ops/sec ±0.87% (94 runs sampled)
fast-deep-equal x 1,332,393 ops/sec ±0.36% (93 runs sampled)
lodash.isEqual x 269,129 ops/sec ±0.59% (95 runs sampled)
nano-equal x 1,122,053 ops/sec ±0.36% (96 runs sampled)
dequal/lite x 1,700,972 ops/sec ±0.31% (94 runs sampled)
dequal x 1,698,972 ops/sec ±0.63% (97 runs sampled)
Benchmark :: complex
assert.deepStrictEqual x 124,518 ops/sec ±0.64% (96 runs sampled)
util.isDeepStrictEqual x 125,113 ops/sec ±0.24% (96 runs sampled)
lodash.isEqual x 58,677 ops/sec ±0.49% (96 runs sampled)
dequal x 345,386 ops/sec ±0.27% (96 runs sampled)
License
MIT © Luke Edwards