Skip to content

isEqual ​

Category
Export size
min 1.28 kB · gzip 0.61 kB
See also

Deep equality for the values a Feathers app passes around — data, results, queries and params. Plain objects are compared by their own enumerable keys in any order (symbols included - sequelize uses them as operators), arrays by their elements, dates and regular expressions by value, a mongo ObjectId (anything with toHexString) by its hex string, and everything else - functions, class instances, maps, sets - by reference: a class instance may keep its state in private fields, so equal looking instances aren't necessarily equal. Self-references are fine.

It never mistakes different values for equal, but may miss equal ones (two distinct Maps with the same entries).

ts
  import { 
isEqual
} from 'feathers-utils/helpers';

Example ​

ts
import { isEqual } from 'feathers-utils/helpers'

isEqual({ a: 1, b: [2] }, { b: [2], a: 1 }) // => true
isEqual(new Date(0), new Date(0)) // => true
isEqual({ name: /^a/ }, { name: /^b/ }) // => false

Type declaration ​

Show Type Declarations
ts
/**
 * Deep equality for the values a Feathers app passes around — data, results,
 * queries and params. Plain objects are compared by their own enumerable keys
 * in any order (symbols included - sequelize uses them as operators), arrays by
 * their elements, dates and regular expressions by value, a mongo `ObjectId`
 * (anything with `toHexString`) by its hex string, and everything else -
 * functions, class instances, maps, sets - by reference: a class instance may
 * keep its state in private fields, so equal looking instances aren't
 * necessarily equal. Self-references are fine.
 *
 * It never mistakes different values for equal, but may miss equal ones (two
 * distinct `Map`s with the same entries).
 *
 * @example
 * ```ts
 *
 *
 * isEqual({ a: 1, b: [2] }, { b: [2], a: 1 }) // => true
 * isEqual(new Date(0), new Date(0)) // => true
 * isEqual({ name: /^a/ }, { name: /^b/ }) // => false
 * ```
 *
 * @see https://utils.feathersjs.com/helpers/is-equal.html
 */
export declare const isEqual: (a: unknown, b: unknown) => boolean
ArgumentTypeDescription
aunknown
bunknown

Coming from lodash ​

Unlike _.isEqual, class instances, Maps and Sets are compared by reference, and a mongo ObjectId by its hex string:

a, b_.isEqualisEqual
new ObjectId(x), new ObjectId(x)truetrue
new Map([[1, 2]]), new Map([[1, 2]])truefalse
two instances of a class with private statetruefalse

So isEqual can report two equal values as different, but never two different values as equal — the safe direction for deciding whether a query, a cached result or a patch has changed.

Released under the MIT License.