Skip to content

Commit 06a483c

Browse files
Charlie Saundersljharb
authored andcommitted
Implements fix and tests for Map equality. Adds test for array equality requiring order.
1 parent ed266e8 commit 06a483c

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

index.js

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ function isBuffer(x) {
5959
return true;
6060
}
6161

62+
function arraysMatch(first, second) {
63+
var i;
64+
for (i = first.length - 1; i >= 0; i--) {
65+
if (first[i] != second[i]) return false;
66+
}
67+
return true;
68+
}
69+
6270
function objEquiv(a, b, opts) {
6371
/* eslint max-statements: [2, 40] */
6472
var i, key;
@@ -109,11 +117,8 @@ function objEquiv(a, b, opts) {
109117
ka.sort();
110118
kb.sort();
111119
// ~~~cheap key test
112-
for (i = ka.length - 1; i >= 0; i--) {
113-
if (ka[i] != kb[i]) {
114-
return false;
115-
}
116-
}
120+
if (!arraysMatch(ka, kb)) return false;
121+
117122
// equivalent values for every corresponding key, and ~~~possibly expensive deep test
118123
for (i = ka.length - 1; i >= 0; i--) {
119124
key = ka[i];
@@ -122,6 +127,24 @@ function objEquiv(a, b, opts) {
122127
}
123128
}
124129

130+
// Maps
131+
if (typeof Map && a.constructor === Map && b.constructor === Map) {
132+
ka = Array.from(a.keys());
133+
kb = Array.from(b.keys());
134+
135+
if (ka.length !== kb.length) return false;
136+
137+
ka.sort();
138+
kb.sort();
139+
140+
if (!arraysMatch(ka, kb)) return false;
141+
142+
for (i = ka.length - 1; i >= 0; i--) {
143+
key = ka[i];
144+
if (!deepEqual(a.get(key), b.get(key), opts)) return false;
145+
}
146+
}
147+
125148
return true;
126149
}
127150

test/cmp.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ test('equal', function (t) {
66
{ a: [2, 3], b: [4] },
77
{ a: [2, 3], b: [4] }
88
));
9+
10+
t.ok(equal(
11+
new Map([['a', 1], ['b', 2]]),
12+
new Map([['b', 2], ['a', 1]])
13+
));
14+
915
t.end();
1016
});
1117

@@ -14,6 +20,16 @@ test('not equal', function (t) {
1420
{ x: 5, y: [6] },
1521
{ x: 5, y: 6 }
1622
));
23+
24+
t.notOk(equal(
25+
new Map([['a', [1, 2]]]),
26+
new Map([['a', [2, 1]]])
27+
));
28+
t.notOk(equal(
29+
new Map([['a', 1]]),
30+
new Map([['b', 1]])
31+
));
32+
1733
t.end();
1834
});
1935

0 commit comments

Comments
 (0)