69. 实现`_.isEqual()`
分享给更多人
中等难度 -通过 / -执行
_.isEqual可以用来深度比较复杂的数据类型。
你能实现一个自己的isEqual
吗?
lodash 的实现支持了很多种数据类型。在该问题中,你只需要支持
- 基础数据类型
- 简单 objects (object literals)
- 数组
Objects在比较时只需要考虑可枚举属性,且不用考虑prototype中的属性。
const a = {a: 'bfe'}const b = {a: 'bfe'}isEqual(a, b) // truea === b // falseconst c = [1, a, '4']const d = [1, b, '4']isEqual(c, d) // truec === d // false
Lodash 版本有些奇怪的行为 (github issue),比如如下的代码。
const a = {}a.self = aconst b = {self: a}const c = {}c.self = cconst d = {self: {self: a}}const e = {self: {self: b}}
lodash.isEqual
返回了如下结果。注意到有一个false的case。
// result from lodash implementation_.isEqual(a, b) // true_.isEqual(a, c) // true_.isEqual(a, d) // true_.isEqual(a, e) // true_.isEqual(b, c) // true_.isEqual(b, d) // true_.isEqual(b, e) // false_.isEqual(c, d) // true_.isEqual(c, e) // true_.isEqual(d, e) // true
先不考虑lodash所提到的性能问题,你的代码不能有上述问题,也就是说上述例子需要全部返回true,并且不能产生maximum call stack size exceeded的error。