有一个应用程序可以处理客户提供的 csv 数据文件。 Javascript 区分大小写。但大多数统计数据包不区分大小写,因此列名以各种大写形式出现。此外,如果他们通过 SAS、SPSS 或其他程序运行文件并另存为新文件,将所有内容转换为大写或小写,则大写字母可能会发生变化。
因此我修改了 D3,使其自动将列名转换为小写。这可以通过修改 d3.js
源代码以添加 .toLocaleUpperCase()
轻松完成,如下所示:
...
dsv.parse = function(text, f) {
var o;
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.toLocaleUpperCase()) + ": d[" + i + "]";
}).join(",") + "}");
o = f ? function(row, i) {
return f(a(row), i);
} : a;
});
};
...
唯一的小挑战是我不能将其作为小猴子补丁或插件添加到我的代码中。这个代码块在 d3.dsv
被导入时被调用,这取决于 d3_xhr
被定义,这需要 d3.xhr
等。所以我下载整个 d3.js
并如上修改,保存为d3.mod.js
。
可以想象一下,当我们需要更新 d3 时,这会在一两年内困扰我或其他开发人员。处理此类模组的正确™方法是什么?
最佳答案
您可以使用d3.csv 的访问器
接受以指定您希望如何转换行数据。
下面的函数接受一个对象并将其所有属性转换为小写。该示例使用 d3.csv.parse()
而不是 d3.csv()
因为它在这里演示更直接,但您可以使用 做同样的事情d3.csv()
.
不幸的是,这个函数会在每一行被调用,而不是在它读入行标题时被调用一次。也许有更好的方法...
var string = "Year,Make,Model,Length\n" +
"1997,Ford,E350,2.34\n" +
"2000,Mercury,Cougar,2.38\n";
function convertPropsToLowerCase(d) {
Object.keys(d).forEach(function(origProp) {
var lowerCaseProp = origProp.toLocaleLowerCase();
// if the uppercase and the original property name differ
// save the value associated with the original prop
// into the lowercase prop and delete the original one
if (lowerCaseProp !== origProp) {
d[lowerCaseProp] = d[origProp];
delete d[origProp];
}
});
return d;
}
var obj = d3.csv.parse(string, convertPropsToLowerCase);
console.log(JSON.stringify(obj,null, '\t'));
/*
[
{
"year": "1997",
"make": "Ford",
"model": "E350",
"length": "2.34"
},
{
"year": "2000",
"make": "Mercury",
"model": "Cougar",
"length": "2.38"
}
]
*/
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
关于javascript - 将 d3.csv 修改为小写列名的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998476/