前言
在前端开发过程中,我们常常需要比较两个对象或数组是否相等。如果直接使用 JavaScript 提供的相等比较运算符 ===
,只能比较浅层次的值相等,无法比较深层次的对象和数组是否相等。针对这种情况,我们可以使用 npm 包 modern-deep-equal
,来帮助我们实现深层次的对象和数组比较。
本文主要介绍了 modern-deep-equal
包的使用方法,包括如何安装和使用,以及详细的示例代码,希望读者可以在实际开发中快速上手。
安装
安装 modern-deep-equal
包非常简单,只需要在终端中运行如下命令即可:
npm install modern-deep-equal --save
使用
安装完成之后,在需要使用的文件中引入 modern-deep-equal
:
const deepEqual = require('modern-deep-equal');
接下来就可以使用 deepEqual
函数进行深层次比较了。
函数签名
先看一下 deepEqual
函数的签名:
deepEqual(a: any, b: any, options?: object): boolean
其中:
a
:需要比较的第一个对象或数组。b
:需要比较的第二个对象或数组。options
:可选参数,是一个对象,用来定制化比较规则,包括strict
、skipKeys
和resolutionType
三个属性。
比较两个对象
比较两个对象是否相等的示例代码如下:
const obj1 = {a: 1, b: [2, {c: '3'}]}; const obj2 = {a: 1, b: [2, {c: '3'}]}; const obj3 = {a: 1, b: [2, {c: '4'}]}; console.log(deepEqual(obj1, obj2)); // 输出 true console.log(deepEqual(obj1, obj3)); // 输出 false
从上面的例子可以看出,当两个对象中的值相同,且结构嵌套层次相同时,返回的结果为 true
,否则返回的结果为 false
。
比较两个数组
比较两个数组是否相等的示例代码如下:
const arr1 = [1, [2, {a: '3'}]]; const arr2 = [1, [2, {a: '3'}]]; const arr3 = [1, [2, {a: '4'}]]; console.log(deepEqual(arr1, arr2)); // 输出 true console.log(deepEqual(arr1, arr3)); // 输出 false
与比较对象类似,比较数组时,两个数组中的元素必须结构和值都相同,才会返回 true
。
定制化比较规则
在使用 deepEqual
函数时,我们可以通过 options
参数来指定比较的方式。下面详细介绍了 options
中的三个属性。
strict
strict
含有三个可选值:true
、false
和 null
,分别代表严格限制、非严格限制和默认规则。默认规则对比定义和类型都要相同才相等,严格限制只对比是否相等,而非严格限制则对大小写和数字类型做宽松处理。
例如,比较 {url: 'http://www.baidu.com'}
和 {url: 'HTTP://www.BAIDU.com'}
:
const obj1 = {url: 'http://www.baidu.com'}; const obj2 = {url: 'HTTP://www.BAIDU.com'}; console.log(deepEqual(obj1, obj2)); // 输出 false console.log(deepEqual(obj1, obj2, {strict: false})); // 输出 true console.log(deepEqual(obj1, obj2, {strict: null})); // 输出 false console.log(deepEqual(obj1, obj2, {strict: true})); // 输出 false
skipKeys
skipKeys
是一个字符串数组,用来指定在比较过程中需要跳过的键;只要对象的键存在于该数组中,就会被跳过。
例如,比较 {a: 1, b: 2}
和 {a: 1, b: 3}
:
const obj1 = {a: 1, b: 2}; const obj2 = {a: 1, b: 3}; const skipKeys = ['b']; console.log(deepEqual(obj1, obj2)); // 输出 false console.log(deepEqual(obj1, obj2, {skipKeys})); // 输出 true
resolutionType
resolutionType
含有两个可选值:jsonstringify
和 default
,分别代表使用 JSON.stringify()
序列化字面量,和使用递归比较。
例如,比较 {a: 1, b: {c: 2}}
和 {a: 1, b: {c: 2, d: 3}}
:
const obj1 = {a: 1, b: {c: 2}}; const obj2 = {a: 1, b: {c: 2, d: 3}}; console.log(deepEqual(obj1, obj2)); // 输出 false console.log(deepEqual(obj1, obj2, {resolutionType: 'jsonstringify'})); // 输出 false
总结
以上就是 modern-deep-equal
包的使用方法。在前端开发中,经常需要进行深层次对象和数组比较,而 modern-deep-equal
包提供了很好的解决方案,可以帮助我们快速实现。通过本文的介绍,相信读者可以掌握 modern-deep-equal
包的使用,也能够应用到实际开发中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005663d81e8991b448e242d