Allow row conversion function for d3.dsv.parse.

This commit is contained in:
Mike Bostock 2013-03-02 13:49:50 -08:00
Родитель 4648db5bdd
Коммит aeb620b3a8
4 изменённых файлов: 63 добавлений и 12 удалений

24
d3.js поставляемый
Просмотреть файл

@ -5235,18 +5235,32 @@ d3 = function() {
function d3_dsv(delimiter, mimeType) {
var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
function dsv(url, callback) {
return d3.xhr(url, mimeType, callback).response(response);
var xhr = d3.xhr(url, mimeType, callback), row;
xhr.row = function(_) {
if (!arguments.length) return row;
xhr.response((row = _) == null ? response : typedResponse(_));
return xhr;
};
return xhr.row(null);
}
function response(request) {
return dsv.parse(request.responseText);
}
dsv.parse = function(text) {
function typedResponse(f) {
return function(request) {
return dsv.parse(request.responseText, f);
};
}
dsv.parse = function(text, f) {
var o;
return dsv.parseRows(text, function(row) {
if (o) return o(row);
o = new Function("d", "return {" + row.map(function(name, i) {
return dsv.parseRows(text, function(row, i) {
if (o) return o(row, i - 1);
var a = new Function("d", "return {" + row.map(function(name, i) {
return JSON.stringify(name) + ": d[" + i + "]";
}).join(",") + "}");
o = f ? function(row, i) {
return f(a(row), i);
} : a;
});
};
dsv.parseRows = function(text, f) {

4
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -3,20 +3,36 @@ function d3_dsv(delimiter, mimeType) {
delimiterCode = delimiter.charCodeAt(0);
function dsv(url, callback) {
return d3.xhr(url, mimeType, callback).response(response);
var xhr = d3.xhr(url, mimeType, callback),
row;
xhr.row = function(_) {
if (!arguments.length) return row;
xhr.response((row = _) == null ? response : typedResponse(_));
return xhr;
};
return xhr.row(null);
}
function response(request) {
return dsv.parse(request.responseText);
}
dsv.parse = function(text) {
function typedResponse(f) {
return function(request) {
return dsv.parse(request.responseText, f);
};
}
dsv.parse = function(text, f) {
var o;
return dsv.parseRows(text, function(row) {
if (o) return o(row);
o = new Function("d", "return {" + row.map(function(name, i) {
return dsv.parseRows(text, function(row, i) {
if (o) return o(row, i - 1);
var a = new Function("d", "return {" + row.map(function(name, i) {
return JSON.stringify(name) + ": d[" + i + "]";
}).join(",") + "}");
o = f ? function(row, i) { return f(a(row), i); } : a;
});
};

Просмотреть файл

@ -76,6 +76,27 @@ suite.addBatch({
]);
}
},
"parse with row function": {
"invokes the row function for every row in order": function() {
var rows = [];
d3.csv.parse("a\n1\n2\n3\n4", function(d, i) { rows.push({d: d, i: i}); });
assert.deepEqual(rows, [
{d: {a: "1"}, i: 0},
{d: {a: "2"}, i: 1},
{d: {a: "3"}, i: 2},
{d: {a: "4"}, i: 3}
]);
},
"returns an array of the row function return values": function() {
assert.deepEqual(d3.csv.parse("a,b,c\n1,2,3\n", function(row) { return row; }), [{a: "1", b: "2", c: "3"}]);
},
"skips rows if the row function returns null or undefined": function() {
assert.deepEqual(d3.csv.parse("a,b,c\n1,2,3\n2,3,4", function(row) { return row.a & 1 ? null : row; }), [{a: "2", b: "3", c: "4"}]);
assert.deepEqual(d3.csv.parse("a,b,c\n1,2,3\n2,3,4", function(row) { return row.a & 1 ? undefined : row; }), [{a: "2", b: "3", c: "4"}]);
}
},
"parseRows": {
topic: function() {
return d3.csv.parseRows;