Skip to content

Commit 617c11b

Browse files
committed
implement isDeepEqual
1 parent 6c56275 commit 617c11b

File tree

3 files changed

+101
-0
lines changed

3 files changed

+101
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import test from 'ava'
2+
3+
import { isDeepEqual } from '../index.js'
4+
5+
const people = {
6+
one: {
7+
firstName: 'John',
8+
lastName: 'Doe',
9+
age: 35
10+
},
11+
two: {
12+
firstName: 'John',
13+
lastName: 'Doe',
14+
age: 35
15+
},
16+
three: {
17+
firstName: 'Akash',
18+
lastName: 'Thakur',
19+
age: 35
20+
},
21+
four: {
22+
firstName: 'Jane',
23+
lastName: 'Doe'
24+
},
25+
five: {
26+
address: {
27+
street: '123 Main St',
28+
inhabitants: ['Chuck', 'Howard', {name: "Jimmy", age: 35}]
29+
}
30+
},
31+
six: {
32+
address: {
33+
street: '123 Main St',
34+
inhabitants: ['Chuck', 'Howard', {name: "Jimmy", age: 35}]
35+
}
36+
},
37+
seven: {
38+
address: {
39+
street: '456 Main St',
40+
inhabitants: ['Chuck', 'Howard', {name: "Jimmy", age: 35}]
41+
}
42+
},
43+
eight: {
44+
address: {
45+
street: '123 Main St',
46+
inhabitants: ['Howard', {name: "Jimmy", age: 35}, 'Chuck']
47+
}
48+
}
49+
}
50+
51+
test('checks identical objects are equal', t => {
52+
t.true(isDeepEqual(people.one, people.two))
53+
t.deepEqual(people.one, people.two)
54+
})
55+
56+
test('checks different objects are not equal', t => {
57+
t.false(isDeepEqual(people.one, people.three))
58+
t.notDeepEqual(people.one, people.three)
59+
})
60+
61+
test('checks objects have the same number of keys', t => {
62+
t.false(isDeepEqual(people.one, people.four))
63+
t.notDeepEqual(people.one, people.four)
64+
})
65+
66+
test('checks nested objects are equal', t => {
67+
t.true(isDeepEqual(people.five, people.six))
68+
t.deepEqual(people.five, people.six)
69+
70+
t.false(isDeepEqual(people.five, people.seven))
71+
t.notDeepEqual(people.five, people.seven)
72+
73+
t.false(isDeepEqual(people.five, people.eight))
74+
t.notDeepEqual(people.five, people.eight)
75+
})
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
export const isDeepEqual = (left: any, right: any) => {
2+
if (!left || !right) return left === right
3+
4+
const leftKeys = Object.keys(left)
5+
const rightKeys = Object.keys(right)
6+
7+
if (leftKeys.length !== rightKeys.length) return false
8+
9+
for (const key of leftKeys) {
10+
const leftValue = left[key]
11+
const rightValue = right[key]
12+
13+
const isObjects = isObject(leftValue) && isObject(rightValue)
14+
15+
if ((isObjects && !isDeepEqual(leftValue, rightValue)) || (!isObjects && leftValue !== rightValue)) {
16+
return false
17+
}
18+
}
19+
20+
return true
21+
}
22+
23+
function isObject(obj: any): obj is object {
24+
return obj != undefined && typeof obj === 'object'
25+
}

packages/kitsu-core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './components/deattribute.js'
2+
export * from './components/deepEqual.js'

0 commit comments

Comments
 (0)