Skip to content

Commit 19dd294

Browse files
committed
Fix d3.nest and d3.ns for built-in properties.
1 parent 1030db1 commit 19dd294

6 files changed

Lines changed: 45 additions & 13 deletions

File tree

d3.v2.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ d3.nest = function() {
276276
o = {};
277277

278278
while (++i < n) {
279-
if ((keyValue = key(object = array[i])) in o) {
279+
if (Object.hasOwnProperty.call(o, keyValue = key(object = array[i]))) {
280280
o[keyValue].push(object);
281281
} else {
282282
o[keyValue] = [object];
@@ -482,10 +482,20 @@ var d3_nsPrefix = {
482482
d3.ns = {
483483
prefix: d3_nsPrefix,
484484
qualify: function(name) {
485-
var i = name.indexOf(":");
486-
return i < 0 ? (name in d3_nsPrefix
487-
? {space: d3_nsPrefix[name], local: name} : name)
488-
: {space: d3_nsPrefix[name.substring(0, i)], local: name.substring(i + 1)};
485+
var i = name.indexOf(":"),
486+
prefix,
487+
local;
488+
if (i < 0) {
489+
return d3_nsPrefix.hasOwnProperty(name)
490+
? {space: d3_nsPrefix[name], local: name} : name;
491+
}
492+
var prefix = name.substring(0, i),
493+
local = name.substring(i + 1);
494+
return {
495+
space: d3_nsPrefix.hasOwnProperty(prefix)
496+
? d3_nsPrefix[prefix] : undefined,
497+
local: local
498+
};
489499
}
490500
};
491501
d3.dispatch = function() {

d3.v2.min.js

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

src/core/nest.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ d3.nest = function() {
1919
o = {};
2020

2121
while (++i < n) {
22-
if ((keyValue = key(object = array[i])) in o) {
22+
if (Object.hasOwnProperty.call(o, keyValue = key(object = array[i]))) {
2323
o[keyValue].push(object);
2424
} else {
2525
o[keyValue] = [object];

src/core/ns.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,19 @@ var d3_nsPrefix = {
99
d3.ns = {
1010
prefix: d3_nsPrefix,
1111
qualify: function(name) {
12-
var i = name.indexOf(":");
13-
return i < 0 ? (name in d3_nsPrefix
14-
? {space: d3_nsPrefix[name], local: name} : name)
15-
: {space: d3_nsPrefix[name.substring(0, i)], local: name.substring(i + 1)};
12+
var i = name.indexOf(":"),
13+
prefix,
14+
local;
15+
if (i < 0) {
16+
return d3_nsPrefix.hasOwnProperty(name)
17+
? {space: d3_nsPrefix[name], local: name} : name;
18+
}
19+
var prefix = name.substring(0, i),
20+
local = name.substring(i + 1);
21+
return {
22+
space: d3_nsPrefix.hasOwnProperty(prefix)
23+
? d3_nsPrefix[prefix] : undefined,
24+
local: local
25+
};
1626
}
1727
};

test/core/nest-test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,13 @@ suite.addBatch({
228228
"if no keys are specified, the input array is returned": function(nest) {
229229
var array = [new Object()];
230230
assert.strictEqual(nest().map(array), array);
231+
},
232+
"handles keys that are built-in prototype properties": function(nest) {
233+
var properties = ["hasOwnProperty"];
234+
var keys = nest()
235+
.key(String)
236+
.map(properties);
237+
assert.deepEqual(keys, {hasOwnProperty: ["hasOwnProperty"]});
231238
}
232239
}
233240
});

test/core/ns-test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ suite.addBatch({
5050
var name = d3.ns.qualify("svg");
5151
assert.equal(name.space, "http://www.w3.org/2000/svg");
5252
assert.equal(name.local, "svg");
53+
},
54+
"built-in prototype properties are ignored": function(qualify) {
55+
var name = qualify("hasOwnProperty:test");
56+
assert.isUndefined(name.space);
57+
assert.equal(name.local, "test");
5358
}
5459
}
5560
});

0 commit comments

Comments
 (0)