Skip to content

Commit 4e5deb0

Browse files
committed
Fix d3.median: coerce strings to numbers.
Fixes d3#2069.
1 parent dd1e916 commit 4e5deb0

4 files changed

Lines changed: 29 additions & 8 deletions

File tree

d3.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,13 @@
104104
return e ? v + e * (values[h] - v) : v;
105105
};
106106
d3.median = function(array, f) {
107-
if (arguments.length > 1) array = array.map(f);
108-
array = array.filter(d3_number);
109-
return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined;
107+
var array1 = [], n = array.length, a, i = -1;
108+
if (arguments.length === 1) {
109+
while (++i < n) if (d3_number(a = array[i])) array1.push(+a);
110+
} else {
111+
while (++i < n) if (d3_number(a = f.call(array, array[i], i))) array1.push(+a);
112+
}
113+
return array1.length ? d3.quantile(array1.sort(d3_ascending), .5) : undefined;
110114
};
111115
function d3_bisector(compare) {
112116
return {

d3.min.js

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

src/arrays/median.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@ import "ascending";
33
import "quantile";
44

55
d3.median = function(array, f) {
6-
if (arguments.length > 1) array = array.map(f);
7-
array = array.filter(d3_number);
8-
return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined;
6+
var array1 = [],
7+
n = array.length,
8+
a,
9+
i = -1;
10+
11+
if (arguments.length === 1) {
12+
while (++i < n) if (d3_number(a = array[i])) array1.push(+a);
13+
} else {
14+
while (++i < n) if (d3_number(a = f.call(array, array[i], i))) array1.push(+a);
15+
}
16+
17+
return array1.length ? d3.quantile(array1.sort(d3_ascending), .5) : undefined;
918
};

test/arrays/median-test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ suite.addBatch({
3232
"applies the optional accessor function": function(median) {
3333
assert.equal(median([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]], function(d) { return median(d); }), 4.5);
3434
assert.equal(median([1, 2, 3, 4, 5], function(d, i) { return i; }), 2);
35+
},
36+
"coerces strings to numbers": function(median) {
37+
assert.equal(median(["1"]), 1);
38+
assert.equal(median(["5", "1", "2", "3", "4"]), 3);
39+
assert.equal(median(["20", "3"]), 11.5);
40+
assert.equal(median(["3", "20"]), 11.5);
41+
assert.equal(median(["2", "3", "20"]), 3);
42+
assert.equal(median(["20", "3", "2"]), 3);
3543
}
3644
}
3745
});

0 commit comments

Comments
 (0)