快速对等
执行 快点燃 两个对象之间的平等比较,同时允许灵活性 各种用例。 它没有依赖性,在被精密化和被克齐化时为~2.65kB.
以下类型处理出箱: 1
- 普通物体(包括
react要素和Arguments(中文(简体) ) - 阵列
ArrayBuffer编号 :TypedArray编号 :DataView实例Date对象RegExp对象Map编号 :Set可移动Promise对象和可选对象Error对象,包括子类及其自身属性URL对象- 初级包装器(
new Boolean()编号 :new Number()编号 :new String()框中输入BigInt(中文(简体) ) - 自定义类例,包括土著类的子类
为深、浅、浅、浅、浅、浅、深、浅、浅、浅、浅、浅、浅、浅、深、浅、浅、浅、浅、浅、浅、浅、深、浅、浅、浅、浅、深、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、深、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、浅、, SameValue, (中文(简体) ),
SameValueZero,或
严格平等 比较。 还有你
可选择支持循环对象,或进行与非传统属性定义的"严格"比较,
或两者兼有。 也可以根据应用程序的使用大小写自定义任何特定类型比较.
默认情况下, npm 应当根据您的消耗量(ESM vs CommunityJS)解决包的正确构建. 然而,如果 您想要强制使用特定的建筑,它们可以在这里找到:
- 无害环境管理
fast-equals/dist/es/index.mjs - 常见JS QQ
fast-equals/dist/cjs/index.cjs
如果你有任何问题, 想要求一个新的功能, 或者有任何问题, 请提交一个问题。 。 。 .
使用量
import { deepEqual } from 'fast-equals';
console.log(deepEqual({ foo: 'bar' }, { foo: 'bar' })); // true
可用方法
深等号
对传递的两个对象进行深刻的平等比较,并返回代表等值的布尔 物体.
import { deepEqual } from 'fast-equals';
const objectA = { foo: { bar: 'baz' } };
const objectB = { foo: { bar: 'baz' } };
console.log(objectA === objectB); // false
console.log(deepEqual(objectA, objectB)); // true
比较 Map编号
Map 对象支持复杂的密钥(对象、阵列等),但
密钥查找的 spec Map 数据基于 SameValueZero。 。 。 .
如果按照这一分类进行比较,则始终如下: false数字 :
const mapA = new Map([[{ foo: 'bar' }, { baz: 'quz' }]]);
const mapB = new Map([[{ foo: 'bar' }, { baz: 'quz' }]]);
deepEqual(mapA, mapB);
为了支持所有内容的真正平等, fast-equals 将对关键和价值进行深刻的平等比较
双人 因此,上述情况将是: true。 。 。 .
浅等价
对传递的两个对象进行浅等比较,并返回代表值的布尔 物体的等同性.
import { shallowEqual } from 'fast-equals';
const nestedObject = { bar: 'baz' };
const objectA = { foo: nestedObject };
const objectB = { foo: nestedObject };
const objectC = { foo: { bar: 'baz' } };
console.log(objectA === objectB); // false
console.log(shallowEqual(objectA, objectB)); // true
console.log(shallowEqual(objectA, objectC)); // false
同一数值
执行 a SameValue 比较所通过和
返回表示对象等值的布尔。 简而言之,这意味着:
+0财务报告和审定财务报表-0不平等NaN等于NaN- 所有其他项目都以优惠平等为基础(
a === b(中文(简体) )
import { sameValueEqual } from 'fast-equals';
const mainObject = { foo: NaN, bar: 'baz' };
const objectA = 'baz';
const objectB = NaN;
const objectC = { foo: NaN, bar: 'baz' };
console.log(sameValueEqual(mainObject.bar, objectA)); // true
console.log(sameValueEqual(mainObject.foo, objectB)); // true
console.log(sameValueEqual(mainObject, objectC)); // false
页:1: 在支持环境
Object.is, (中文(简体) ),
sameValueEqual 这仅仅是这种方法的再出口.
同为等价
执行 a SameValueZero 比较两个对象
并返回表示对象等值的布尔值。 简而言之,这意味着:
+0财务报告和审定财务报表-0平等NaN等于NaN- 所有其他项目都以优惠平等为基础(
a === b(中文(简体) )
import { sameValueZeroEqual } from 'fast-equals';
const mainObject = { foo: NaN, bar: 'baz' };
const objectA = 'baz';
const objectB = NaN;
const objectC = { foo: NaN, bar: 'baz' };
console.log(sameValueZeroEqual(mainObject.bar, objectA)); // true
console.log(sameValueZeroEqual(mainObject.foo, objectB)); // true
console.log(sameValueZeroEqual(mainObject, objectC)); // false
严格平等
执行 a 严格平等 比较 两个对象传递并返回一个布尔表示对象的偏好平等。 简而言之,这个 表示:
+0财务报告和审定财务报表-0平等NaN不等同于NaN- 所有其他项目都以优惠平等为基础(
a === b(中文(简体) )
import { strictEqual } from 'fast-equals';
const mainObject = { foo: NaN, bar: 'baz' };
const objectA = 'baz';
const objectB = NaN;
const objectC = { foo: NaN, bar: 'baz' };
console.log(strictEqual(mainObject.bar, objectA)); // true
console.log(strictEqual(mainObject.foo, objectB)); // false
console.log(strictEqual(mainObject, objectC)); // false
页:1:这主要是一种方便功能,例如需要默认的功能平等参照. 当然,
比较一下就快了 a === b. ) (中文(简体) )
圆深平方
进行与 deepEqual 但支持圆形对象。 慢过 deepEqual,所以只有在
你知道有圆形物体存在.
function Circular(value) {
this.me = {
deeply: {
nested: {
reference: this,
},
},
value,
};
}
console.log(circularDeepEqual(new Circular('foo'), new Circular('foo'))); // true
console.log(circularDeepEqual(new Circular('foo'), new Circular('bar'))); // false
和以前一样 deepEqual, (中文(简体) ), 将钥匙和价值进行比较,以实现深度平等。 。 。 .
圆筒平面
进行与 shallowEqual 但支持圆形对象。 慢过 shallowEqual因此,仅
如果您知道存在圆形物体,则使用.
const array = ['foo'];
array.push(array);
console.log(circularShallowEqual(array, ['foo', array])); // true
console.log(circularShallowEqual(array, [array])); // false
严格
进行与 deepEqual 但要严格比较对象。 这包括:
- 正在检查符号属性
- 检查对象比较中的不可假定属性
- 检查对象上属性的完整描述符以匹配
- 检查数组中的非索引属性
- 正在检查非密钥属性
Map编号 :Set对象 - 检查自己的属性
Date对象
const array = [{ foo: 'bar' }];
const otherArray = [{ foo: 'bar' }];
array.bar = 'baz';
otherArray.bar = 'baz';
console.log(strictDeepEqual(array, otherArray)); // true
console.log(strictDeepEqual(array, [{ foo: 'bar' }])); // false
严格平面
进行与 shallowEqual 但要严格比较对象。 这包括:
- 检查对象比较中的不可假定属性
- 检查对象上属性的完整描述符以匹配
- 检查数组中的非索引属性
- 正在检查非密钥属性
Map编号 :Set对象 - 检查自己的属性
Date对象
const array = ['foo'];
const otherArray = ['foo'];
array.bar = 'baz';
otherArray.bar = 'baz';
console.log(strictShallowEqual(array, otherArray)); // true
console.log(strictShallowEqual(array, ['foo'])); // false
严格圆深等分
进行与 circularDeepEqual 但要严格比较对象。 这包括:
- 检查中
Symbol对象的属性 - 检查对象比较中的不可假定属性
- 检查对象上属性的完整描述符以匹配
- 检查数组中的非索引属性
- 正在检查非密钥属性
Map编号 :Set对象 - 检查自己的属性
Date对象
function Circular(value) {
this.me = {
deeply: {
nested: {
reference: this,
},
},
value,
};
}
const first = new Circular('foo');
Object.defineProperty(first, 'bar', {
enumerable: false,
value: 'baz',
});
const second = new Circular('foo');
Object.defineProperty(second, 'bar', {
enumerable: false,
value: 'baz',
});
console.log(strictCircularDeepEqual(first, second)); // true
console.log(strictCircularDeepEqual(first, new Circular('foo'))); // false
严格圆形平面
进行与 circularShallowEqual 但要严格比较对象。 这包括:
- 检查对象比较中的不可假定属性
- 检查对象上属性的完整描述符以匹配
- 检查数组中的非索引属性
- 正在检查非密钥属性
Map编号 :Set对象 - 检查自己的属性
Date对象
const array = ['foo'];
const otherArray = ['foo'];
array.push(array);
otherArray.push(array); // Shallow comparison requires the same nested reference.
array.bar = 'baz';
otherArray.bar = 'baz';
console.log(strictCircularShallowEqual(array, otherArray)); // true
console.log(strictCircularShallowEqual(array, ['foo', array])); // false
创建 CustomEqual
创建自定义平等参照器,用于对象中的嵌入值。 与 deepEqual 财务报告和审定财务报表
shallowEqual,这是工厂方法,接收内部使用的默认选项,并允许您覆盖
默认值。 这通常适用于极端边缘情况,或支持遗留环境.
签字情况如下:
interface Cache<Key extends object, Value> {
delete(key: Key): boolean;
get(key: Key): Value | undefined;
set(key: Key, value: any): any;
}
interface ComparatorConfig<Meta> {
areArrayBuffersEqual: EqualityComparator<Meta>;
areArraysEqual: EqualityComparator<Meta>;
areDataViewsEqual: EqualityComparator<Meta>;
areDatesEqual: EqualityComparator<Meta>;
areErrorsEqual: EqualityComparator<Meta>;
areFunctionsEqual: EqualityComparator<Meta>;
areMapsEqual: EqualityComparator<Meta>;
areNumbersEqual: EqualityComparator<Meta>;
areObjectsEqual: EqualityComparator<Meta>;
arePrimitiveWrappersEqual: EqualityComparator<Meta>;
areRegExpsEqual: EqualityComparator<Meta>;
areSetsEqual: EqualityComparator<Meta>;
areTypedArraysEqual: EqualityComparator<Meta>;
areUrlsEqual: EqualityComparator<Meta>;
getUnsupportedCustomComparator:
(<Type>(a: Type, b: Type, state: State<Meta>, tag: string) => EqualityComparator<Meta> | undefined) | undefined;
strictNullPrototypeComparison?: boolean;
}
function createCustomEqual<Meta>(options: {
circular?: boolean;
createCustomConfig?: (defaultConfig: ComparatorConfig<Meta>) => Partial<ComparatorConfig<Meta>>;
createInternalComparator?: (
compare: <A, B>(a: A, b: B, state: State<Meta>) => boolean,
) => (a: any, b: any, indexOrKeyA: any, indexOrKeyB: any, parentA: any, parentB: any, state: State<Meta>) => boolean;
createState?: () => { cache?: Cache; meta?: Meta };
strict?: boolean;
strictNullPrototypeComparison?: boolean;
}): <A, B>(a: A, b: B) => boolean;
创建自定义平等比较器。 这样可以完全控制一种讲求平等的方法的建立,如果您 使用案例需要更高程度的性能、遗留的环境支持或任何其他非标准使用。 这个 食谱 提供不同用例中的用法实例,但如果您有特定的目标,并且会 像援助 感觉自由 提交问题。 。 。 .
页:1数字 : Map 执行中比较了键和值的平等性。 使用自定义比较器和比较时
键的等同性,重复索引作为两个 indexOrKeyA 财务报告和审定财务报表 indexOrKeyB 帮助使用中
将关键事项排序为平等.
严格Null Prototype 比较
默认为 true,它保持一个无原型物体(Object.create(null)(a) 与原为相同的平原不平等
对象。 准备吧 false 来比较这两个字典,例如:
ProseMiror 节点属性 或者说 Object.groupBy 结果.
const equal = createCustomEqual({ strictNullPrototypeComparison: false });
const attrs = Object.assign(Object.create(null), { aspectRatio: 16 / 9 });
equal(attrs, { ...attrs }); // true
这是构造器检查的唯一例外: 无效原型对象对阵列仍然不平等, Maps,日期,
以及不同的阶级建筑师 彼此之间仍然不平等 它适用于嵌入值并且能够
与 circular, (中文(简体) ), strict和自定义比较器.
获取未支持的客户端
如果您想要比较标记未处理的对象( 如自定义) Symbol.toStringTag 或一个
WeakMap您可以提供 getUnsupportedCustomComparator 方法。 它得到两个数值, 比较状态,
和标签,并返回用于它们的比较器。 正在返回 undefined 将值视为不平等。 见
此食谱 举个例子.
食谱
已经创建了一些食谱,以提供使用实例 createCustomEqual即使不直接适用
对于你正在解决的问题, 他们可以提供指导 如何构建你的解决方案.
基准
所有基准都是在使用NodeJS版本的有64GB内存的i9-1100H Ubuntu Linux 24.04笔记本电脑上实现的
24.15.0,并基于基于以下对象类型高度平等的运行比较平均值:
- 初级
String, (中文(简体) ),Number, (中文(简体) ),null, (中文(简体) ),undefined(中文(简体) ) FunctionObjectArrayDateRegExpreact要素- 上述所有类型组合在一起的混合对象
Testing mixed objects equal...
┌────────────────────────────────────────┬────────────────┐
│ Name │ Ops / sec │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (passed) │ 1763109.81851 │
├────────────────────────────────────────┼────────────────┤
│ fast-deep-equal (passed) │ 1297247.799465 │
├────────────────────────────────────────┼────────────────┤
│ react-fast-compare (passed) │ 1271146.258704 │
├────────────────────────────────────────┼────────────────┤
│ shallow-equal-fuzzy (passed) │ 1235115.693854 │
├────────────────────────────────────────┼────────────────┤
│ nano-equal (failed) │ 964815.367752 │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (circular) (passed) │ 834232.686567 │
├────────────────────────────────────────┼────────────────┤
│ dequal (passed) │ 759417.072806 │
├────────────────────────────────────────┼────────────────┤
│ dequal/lite (passed) │ 751901.517376 │
├────────────────────────────────────────┼────────────────┤
│ underscore.isEqual (passed) │ 447789.934941 │
├────────────────────────────────────────┼────────────────┤
│ assert.deepStrictEqual (passed) │ 433256.455121 │
├────────────────────────────────────────┼────────────────┤
│ es-toolkit (passed) │ 343382.909087 │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (strict) (passed) │ 294211.792998 │
├────────────────────────────────────────┼────────────────┤
│ lodash.isEqual (passed) │ 290477.460766 │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (strict circular) (passed) │ 232110.748904 │
├────────────────────────────────────────┼────────────────┤
│ deep-eql (passed) │ 161408.4511 │
├────────────────────────────────────────┼────────────────┤
│ deep-equal (passed) │ 951.279346 │
└────────────────────────────────────────┴────────────────┘
Testing mixed objects not equal...
┌────────────────────────────────────────┬────────────────┐
│ Name │ Ops / sec │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (passed) │ 5402008.064431 │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (circular) (passed) │ 3687783.563818 │
├────────────────────────────────────────┼────────────────┤
│ fast-deep-equal (passed) │ 3479884.479164 │
├────────────────────────────────────────┼────────────────┤
│ react-fast-compare (passed) │ 3356141.586592 │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (strict) (passed) │ 2927133.435788 │
├────────────────────────────────────────┼────────────────┤
│ fast-equals (strict circular) (passed) │ 1566187.833636 │
├────────────────────────────────────────┼────────────────┤
│ dequal/lite (passed) │ 1316031.262808 │
├────────────────────────────────────────┼────────────────┤
│ dequal (passed) │ 1298255.762153 │
├────────────────────────────────────────┼────────────────┤
│ shallow-equal-fuzzy (failed) │ 1219217.578795 │
├────────────────────────────────────────┼────────────────┤
│ nano-equal (passed) │ 1074115.593615 │
├────────────────────────────────────────┼────────────────┤
│ underscore.isEqual (passed) │ 659016.868085 │
├────────────────────────────────────────┼────────────────┤
│ lodash.isEqual (passed) │ 374944.853605 │
├────────────────────────────────────────┼────────────────┤
│ es-toolkit (passed) │ 355882.255615 │
├────────────────────────────────────────┼────────────────┤
│ deep-eql (passed) │ 182235.73069 │
├────────────────────────────────────────┼────────────────┤
│ assert.deepStrictEqual (passed) │ 20975.582116 │
├────────────────────────────────────────┼────────────────┤
│ deep-equal (passed) │ 3760.574487 │
└────────────────────────────────────────┴────────────────┘
影响基准的洞穴(和比较的准确性):
Maps, (中文(简体) ),Promises,和Sets 完全排除在基准之外,因为除了图书馆之外没有其他图书馆deep-eql完全支持它们的比较fast-deep-equal, (中文(简体) ),react-fast-compare财务报告和审定财务报表nano-equal在对象上投掷null作为原型 (单位:千美元)Object.create(null)(中文(简体) )assert.deepStrictEqual不支持NaN或者说SameValue日期平等deep-eql不支持SameValue平等与零平等(正与负0不相等)deep-equal不支持NaN并且不严格比较对象类型,或日期/正则解释值,也不使用SameValue日期平等fast-deep-equal不支持NaN或者说SameValue日期平等nano-equal不严格比较对象属性结构、阵列长度或对象类型,也不SameValue日期平等react-fast-compare不支持NaN或者说SameValue日期平等,而不作比较function平等shallow-equal-fuzzy不严格比较对象类型或正则解释值,也不SameValue日期平等underscore.isEqual不支持SameValue原始人或日期的平等
所有这些都有可能夸大各图书馆的数目,而与之相比,这些图书馆的数量可能增加 fast-equals但它确实
苹果对苹果最接近的比较 我可以创建一个合理的样本大小。 应当指出 react
元素可以是循环对象,而无论简单的元素不是;我保留了 react 比较非常基本,允许
将列入.