Skip to content

Commit 9bcc57c

Browse files
committed
Use Object.create(null) for maps.
1 parent 85e4c50 commit 9bcc57c

4 files changed

Lines changed: 58 additions & 101 deletions

File tree

d3.js

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -241,84 +241,67 @@
241241
}); else for (var key in object) map.set(key, object[key]);
242242
return map;
243243
};
244-
function d3_Map() {}
244+
function d3_Map() {
245+
this._ = Object.create(null);
246+
}
245247
d3_class(d3_Map, {
246248
has: d3_map_has,
247249
get: function(key) {
248-
return this[d3_map_escape(key)];
250+
return this._[key];
249251
},
250252
set: function(key, value) {
251-
return this[d3_map_escape(key)] = value;
253+
return this._[key] = value;
252254
},
253255
remove: d3_map_remove,
254256
keys: d3_map_keys,
255257
values: function() {
256258
var values = [];
257-
for (var key in this) {
258-
if (d3_map_hasOwnProperty.call(this, key)) {
259-
values.push(this[key]);
260-
}
259+
for (var key in this._) {
260+
values.push(this._[key]);
261261
}
262262
return values;
263263
},
264264
entries: function() {
265265
var entries = [];
266-
for (var key in this) {
267-
if (d3_map_hasOwnProperty.call(this, key)) {
268-
entries.push({
269-
key: d3_map_unescape(key),
270-
value: this[key]
271-
});
272-
}
266+
for (var key in this._) {
267+
entries.push({
268+
key: key,
269+
value: this._[key]
270+
});
273271
}
274272
return entries;
275273
},
276274
size: d3_map_size,
277275
empty: d3_map_empty,
278276
forEach: function(f) {
279-
for (var key in this) {
280-
if (d3_map_hasOwnProperty.call(this, key)) {
281-
f.call(this, d3_map_unescape(key), this[key]);
282-
}
277+
for (var key in this._) {
278+
f.call(this, key, this._[key]);
283279
}
284280
}
285281
});
286-
var d3_map_prefix = "\x00", d3_map_builtin = new d3_Map(), d3_map_hasOwnProperty = Object.prototype.hasOwnProperty;
287-
function d3_map_escape(key) {
288-
return (key += "") in d3_map_builtin || key[0] === d3_map_prefix ? d3_map_prefix + key : key;
289-
}
290-
function d3_map_unescape(key) {
291-
return (key += "")[0] === d3_map_prefix ? key.slice(1) : key;
292-
}
293282
function d3_map_has(key) {
294-
return d3_map_escape(key) in this;
283+
return key in this._;
295284
}
296285
function d3_map_remove(key) {
297-
return (key = d3_map_escape(key)) in this && delete this[key];
286+
return key in this._ && delete this._[key];
298287
}
299288
function d3_map_keys() {
300289
var keys = [];
301-
for (var key in this) {
302-
if (d3_map_hasOwnProperty.call(this, key)) {
303-
keys.push(d3_map_unescape(key));
304-
}
290+
for (var key in this._) {
291+
keys.push(key);
305292
}
306293
return keys;
307294
}
308295
function d3_map_size() {
309296
var size = 0;
310-
for (var key in this) {
311-
if (d3_map_hasOwnProperty.call(this, key)) {
312-
++size;
313-
}
297+
for (var key in this._) {
298+
++size;
314299
}
315300
return size;
316301
}
317302
function d3_map_empty() {
318-
for (var key in this) {
319-
if (d3_map_hasOwnProperty.call(this, key)) {
320-
return false;
321-
}
303+
for (var key in this._) {
304+
return false;
322305
}
323306
return true;
324307
}
@@ -390,26 +373,25 @@
390373
if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
391374
return set;
392375
};
393-
function d3_Set() {}
376+
function d3_Set() {
377+
this._ = Object.create(null);
378+
}
394379
d3_class(d3_Set, {
395380
has: d3_map_has,
396381
add: function(key) {
397-
this[d3_map_escape(key)] = true;
382+
this._[key] = true;
398383
return key;
399384
},
400385
remove: d3_map_remove,
401386
values: d3_map_keys,
402387
size: d3_map_size,
403388
empty: d3_map_empty,
404389
forEach: function(f) {
405-
for (var key in this) {
406-
if (d3_map_hasOwnProperty.call(this, key)) {
407-
f.call(this, d3_map_unescape(key));
408-
}
390+
for (var key in this._) {
391+
f.call(this, key);
409392
}
410393
}
411394
});
412-
for (var key in new d3_Set()) d3_map_builtin[key] = true;
413395
d3.behavior = {};
414396
d3.rebind = function(target, source) {
415397
var i = 1, n = arguments.length, method;

d3.min.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/arrays/map.js

Lines changed: 19 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,92 +7,70 @@ d3.map = function(object) {
77
return map;
88
};
99

10-
function d3_Map() {}
10+
function d3_Map() {
11+
this._ = Object.create(null);
12+
}
1113

1214
d3_class(d3_Map, {
1315
has: d3_map_has,
1416
get: function(key) {
15-
return this[d3_map_escape(key)];
17+
return this._[key];
1618
},
1719
set: function(key, value) {
18-
return this[d3_map_escape(key)] = value;
20+
return this._[key] = value;
1921
},
2022
remove: d3_map_remove,
2123
keys: d3_map_keys,
2224
values: function() {
2325
var values = [];
24-
for (var key in this) {
25-
if (d3_map_hasOwnProperty.call(this, key)) {
26-
values.push(this[key]);
27-
}
26+
for (var key in this._) {
27+
values.push(this._[key]);
2828
}
2929
return values;
3030
},
3131
entries: function() {
3232
var entries = [];
33-
for (var key in this) {
34-
if (d3_map_hasOwnProperty.call(this, key)) {
35-
entries.push({key: d3_map_unescape(key), value: this[key]});
36-
}
33+
for (var key in this._) {
34+
entries.push({key: key, value: this._[key]});
3735
}
3836
return entries;
3937
},
4038
size: d3_map_size,
4139
empty: d3_map_empty,
4240
forEach: function(f) {
43-
for (var key in this) {
44-
if (d3_map_hasOwnProperty.call(this, key)) {
45-
f.call(this, d3_map_unescape(key), this[key]);
46-
}
41+
for (var key in this._) {
42+
f.call(this, key, this._[key]);
4743
}
4844
}
4945
});
5046

51-
var d3_map_prefix = "\0", // prevent collision with built-ins
52-
d3_map_builtin = new d3_Map,
53-
d3_map_hasOwnProperty = Object.prototype.hasOwnProperty;
54-
55-
function d3_map_escape(key) {
56-
return (key += "") in d3_map_builtin || key[0] === d3_map_prefix ? d3_map_prefix + key : key;
57-
}
58-
59-
function d3_map_unescape(key) {
60-
return (key += "")[0] === d3_map_prefix ? key.slice(1) : key;
61-
}
62-
6347
function d3_map_has(key) {
64-
return d3_map_escape(key) in this;
48+
return key in this._;
6549
}
6650

6751
function d3_map_remove(key) {
68-
return (key = d3_map_escape(key)) in this && delete this[key];
52+
return key in this._ && delete this._[key];
6953
}
7054

7155
function d3_map_keys() {
7256
var keys = [];
73-
for (var key in this) {
74-
if (d3_map_hasOwnProperty.call(this, key)) {
75-
keys.push(d3_map_unescape(key));
76-
}
57+
for (var key in this._) {
58+
keys.push(key);
7759
}
7860
return keys;
7961
}
8062

8163
function d3_map_size() {
8264
var size = 0;
83-
for (var key in this) {
84-
if (d3_map_hasOwnProperty.call(this, key)) {
85-
++size;
86-
}
65+
for (var key in this._) {
66+
++size;
8767
}
8868
return size;
8969
}
9070

9171
function d3_map_empty() {
92-
for (var key in this) {
93-
if (d3_map_hasOwnProperty.call(this, key)) {
94-
return false;
95-
}
72+
for (var key in this._) {
73+
return false;
9674
}
9775
return true;
9876
}

src/arrays/set.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,23 @@ d3.set = function(array) {
77
return set;
88
};
99

10-
function d3_Set() {}
10+
function d3_Set() {
11+
this._ = Object.create(null);
12+
}
1113

1214
d3_class(d3_Set, {
1315
has: d3_map_has,
1416
add: function(key) {
15-
this[d3_map_escape(key)] = true;
17+
this._[key] = true;
1618
return key;
1719
},
1820
remove: d3_map_remove,
1921
values: d3_map_keys,
2022
size: d3_map_size,
2123
empty: d3_map_empty,
2224
forEach: function(f) {
23-
for (var key in this) {
24-
if (d3_map_hasOwnProperty.call(this, key)) {
25-
f.call(this, d3_map_unescape(key));
26-
}
25+
for (var key in this._) {
26+
f.call(this, key);
2727
}
2828
}
2929
});
30-
31-
// In case Object.defineProperty is not supported…
32-
for (var key in new d3_Set) d3_map_builtin[key] = true;

0 commit comments

Comments
 (0)