在我们的实际开发过程中,常常需要去比较两个数据是否相同,对于字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol这些基础类型来说,我们只需要用 ===
比较一下就可以了,也就没有必要写这个东西,但是对于对象和数组呢?
初衷
项目开发过程中遇到需要比较两个对象,数组的内容,也有尝试过如转换成 base64,转换成字符串比较,结果都不理想,毕竟对象是没有顺序的。
我也有在网上看过一些别人写的,有比我写的好的,但也有用 toString() 之后比较的。
然后也想到了我前几天复习的(尾)递归,就动手写了一下。
主要用到的是 ES6 的 arr.every() 函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| function compare(before, after) { if (typeof before === "symbol" && typeof after === "symbol" || typeof before === "string" && typeof after === "string" || typeof before === "number" && typeof after === "number" || typeof before === "boolean" && typeof after === "boolean" || typeof before === "undefined" && typeof after === "undefined") {
if (isNaN(before) === true && isNaN(after) === true && typeof before === "number" && typeof after === "number") return true
if (before === after) return true
return false }
if (Array.isArray(before) === true && Array.isArray(before) === true) { if (before.length !== after.length) return false
return before.every((item, index, arr) => compare(item, after[index])) } if (typeof before === 'object' && typeof after === 'object') {
if (before === after) return true
if (!before || !after) return false
if (Object.keys(before).length !== Object.keys(after).length) return false
return Object.keys(before).every((item, index, arr) => compare(before[item], after[item])) } return false }
|
代码如上,开箱即用,我也写了一些简单数据来测试,结果还算满意。但是遇上大量数据时,会不会因为递归导致崩溃这就难说了(●'◡'●)
。
差点忘了说
还有好多好多没有去比较,继承类、函数等等
如果有遇到不能用这个方法去比较的,我会回来检查更新的。
其实不知道函数到底要怎么比较,也不知道类要怎么比较,很多很多都还不了解,能力有限,到此为止叭。
再说一遍
ES6 真好用(●'◡'●)
。
仙人指路
Array.prototype.every