我见过很多d3.csv()
回调映射的示例,例如:
var data = raw_data.map(function(d) { return
variable1 : +d.variable1,
variable2 : +d.variable2
});
但是,我试图找出如何使用map.()
进行JSON回调。原因是我有一个属性d:期望数字," MaNn"," NaNz"错误。如果我没有弄错,这个错误通常与被解析为字符串的数据相关联。 JSON看起来是数字/浮点数,但是如果D3将我的数据解析为字符串,我想将其映射为数字,以便我可以排除从控制台日志错误解析为字符串的罪魁祸首。所以,我尝试的内容与上面的csv案例大致相同,使用了一元+
:
var json = raw_json.map(function(d) { return
xs: +d.xs,
ys: +d.ys,
id: +d.id
});
此时,错误仍然存在。但是,我不确定是否完全拒绝了我的字符串解析错误的原假设,因为我并不完全相信我的JSON数据.map()
具有正确的语法。我此刻处于不确定状态。
问题:我的.map()
完全错了吗?我可以做些什么来解决预期的数字错误?
我意识到JSON文件具有广泛的数据结构。以下是我的console.log(raw_json)
在控制台日志中的外观屏幕截图:
答案 0 :(得分:1)
您的.map()
与您的JSON数据不符。您的JSON包含一个数组,其中一个对象包含id
,xs
和ys
的三个数组 }。要将所有这些字符串转换为数值,您需要三个独立的循环:
var obj = raw_json[0];
obj.id = obj.id.map(id => +id);
obj.xs = obj.xs.map(x => +x);
obj.ys = obj.ys.map(y => +y);
或者,最好是,由于您不需要在转换为数字时创建新数组,因此您也可以使用.forEach()
代替.map()
在现场进行转换。
const toNum = (d, i, a) => { a[i] = +d }; // Conversion function
var obj = raw_json[0];
obj.id.forEach(toNum);
obj.xs.forEach(toNum);
obj.ys.forEach(toNum);
看一下以下工作示例:
var raw = `
[{
"id": ["1", "2", "3"],
"xs": ["11", "12", "13"],
"ys": ["21", "22", "23"]
}]
`;
var data = JSON.parse(raw);
const toNum = (d, i, a) => { a[i] = +d }; // Conversion function
var obj = data[0];
obj.id.forEach(toNum);
obj.xs.forEach(toNum);
obj.ys.forEach(toNum);
console.dir(data);